18. 4Sum

来源:互联网 发布:广州凯申物流 知乎 编辑:程序博客网 时间:2024/05/22 01:38

18. 4Sum

       Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target ? Find all unique quadruplets in the array which gives the sum of target.

       Note : The solution set must not contain duplicate quadruplets.

For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is :[    [-1, 0, 0, 1],    [-2, -1, 1, 2],    [-2, 0, 0, 2]]

思路

  • 对数组排序

  • 确定四元数中的前两个(a,b)

  • 遍历剩余数组确定两外两个(c,d),确定cd时思路跟3Sum确定后两个数据一样,二分查找左右逼近。

  • 在去重时采用set集合

问题

       第一次提交自己写的如下代码也会超时,主要原因是在每层循环的时候都调用nums.size()会造成很多的时间浪费,因为其是一个不变的值,所以应该初始化的时候直接把他付给一个整形变量,后面就不会再重复调用nums.size()了,降低时间复杂度

class Solution {public:    vector<vector<int>> fourSum(vector<int>& nums, int target) {        set<vector<int>> res2;        vector<vector<int>> res;        sort(nums.begin(), nums.end());        int len = nums.size();        for (int i = 0;i<len-3;i++)        {            for (int j = i+1;j<len-2;j++)            {               int pre = j + 1;               int tail = len - 1;               while (pre < tail)               {                   vector<int> tempRes;                   int sum = nums[i] + nums[j] + nums[pre] + nums[tail];                   if (sum == target)                   {                       tempRes.push_back(nums[i]);                       tempRes.push_back(nums[j]);                       tempRes.push_back(nums[pre]);                       tempRes.push_back(nums[tail]);                       res2.insert(tempRes);                       pre++;                       tail--;                   }                   else if (sum < target)                   {                       pre++;                   }                   else                       tail--;               }            }        }        for (auto r : res2)        {            res.push_back(r);        }        return res;    }};int main(){    vector<int> s = { -3,-2,-1,0,0,1,2,3 };    int target = 0;    Solution3 ss;    auto res = ss.fourSum(s, target);    system("pause");    return 0;}
原创粉丝点击