leetcode18 四数之和 双指针

题外话:

这道题让我想起了

挑战程序设计竞赛有一个抽签问题,类似的a+b+c+d=target,可以重复使用一个数。

a+b+c+d=target转化为 a+b=target-c-d。  如果只是判断是否存在,那么可以预处理,得到所有c+d的值,然后binary_search (target-a-b)

处理方法

对于一个共有n个数的数组,准备一个数组int kk

kk[c*n+d]=k[c]+k[d]。

复杂度O(n^2log(n))

 然后这道题:

就和前两个题差不多,先固定两个数,然后双指针法

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>>ret;
        if(nums.empty())
            return ret;
        int len=nums.size();
        if(len<4)
            return ret;
        sort(nums.begin(),nums.end());
        for (int i = 0; i < len - 3; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) 
                continue;
            for(int j=i+1;j<len-2;j++){
                if(nums[j]==nums[j-1]&&(j>i+1))
                    continue;
            int l = j + 1;
            int r = len - 1;
            while (l < r) { //多组
                int s = nums[i] + nums[l] + nums[r]+nums[j];
                if (s > target)
                    r--;
                else if (s < target)
                    l++;
                else {
                    ret.push_back({nums[i], nums[j],nums[l], nums[r]});
                    while (l < r && nums[l] == nums[++l]);
                    while (l < r && nums[r] == nums[--r]);
                    }
                }
            }
        }
        return ret;
    }
};

猜你喜欢

转载自www.cnblogs.com/lqerio/p/11759402.html
今日推荐