zoukankan      html  css  js  c++  java
  • LeetCode-18-4Sum

    一、问题描述

      给定一个数组S,和一个int类型的数target,在S中寻找四个数,这四个数之和为target。返回一个vector<vector<int>>

      例子:S={1, 0, -1, 0, -2, 2},target = 0.返回结果为{{-1,0,0,1},{-2,1,1,2},{-2,0,0,2}}

    二、问题解决

      最简单的思路是四层循环,这样不管是之前的3之和问题还是4之和问题都能解决,缺点就是比较费时,在leetcode上提交还可能超时。

      更好一点的方式是对数组进行排序之后,从两边逼近的方式。这样可以减少一层循环,3数之和就先确定一个数,4数之和就先确定两个数。本题下面的解法之中,固定i和j,让k和l冲两边逼近。

      这题比较麻烦的是去重复。

    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        if (nums.size() < 4) return result;
        sort(nums.begin(),nums.end());
        /*
        for (auto o : nums)
            cout << o;
        cout << endl;
        */
        for (int i = 0; i < nums.size() - 3; i++) {
         //去除重复
    while (i != 0 && nums.at(i - 1) == nums.at(i)) i++; for (int j = i + 1; j < nums.size() - 2; j++) {
           //去除重复
    while (j != i + 1 && j+1 <nums.size()-1&& nums.at(j-1) == nums.at(j)) j++; int k = j + 1, l = nums.size()-1; while (k < l) { //cout << i << j << k << l << endl; if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) == target) { vector<int> temp; temp.emplace_back(nums.at(i)); temp.emplace_back(nums.at(j)); temp.emplace_back(nums.at(k)); temp.emplace_back(nums.at(l)); result.emplace_back(temp);
                //去除重复
    while (k + 1 < l && nums.at(k) == nums.at(k + 1)) k++; while (l-1 > k && nums.at(l) == nums.at(l - 1)) l--; k++; } if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) > target) l--; if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) < target) k++; } } } //result.erase(unique(result.begin(), result.end()),result.end()); return result; }
  • 相关阅读:
    SVN 怎么让文件脱离 版本控制
    WEB开发中使用和理解 .net中的认证与授权
    三层,师姐把我点透了
    三层与养猪,加入自己的理解。
    Asp.net的登录验证方法Web.config访问权限配置
    <%=%> 引发的aspx文件、.aspx.cs文件和.aspx.designer.cs的一些说明
    bin。obj Properties文件夹
    JS得到对应字段 的值。遍历
    C#中页面传值的方法。转载
    $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • 原文地址:https://www.cnblogs.com/likaiming/p/8280311.html
Copyright © 2011-2022 走看看