18. 4 Sum

题目:

解答:

与之前的三数之和的解法类似,也是先排序,然后不断剔除不可能的条件,最后两个参数,通过两头求和计算得出。

代码:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        int len = nums.size();
        if(len < 4) return result;
        sort(nums.begin(), nums.end());
        for(int i = 0;i < len - 3;){
            if(nums[i] * 4 > target)    break;
            for(int j = i + 1;j < len - 2;){
                if((nums[i] + nums[j]) * 2 > target)  break;
                int remain = target - nums[i] - nums[j];
                int begin = j + 1, end = len - 1;
                while(begin < end){
                    int tmp = nums[begin] + nums[end];
                    if(tmp > remain){
                        while(begin < end && nums[end-1] == nums[end])
                            --end;
                        --end;
                    }
                    else if(tmp < remain){
                        while(begin < end && nums[begin+1] == nums[begin])
                            ++begin;
                        ++begin;
                    }
                    else{
                        vector<int> vec({nums[i], nums[j], nums[begin], nums[end]});
                        result.push_back(vec);
                        while(begin < end && nums[end-1] == nums[end])
                            --end;
                        while(begin < end && nums[begin+1] == nums[begin])
                            ++begin;
                        --end, ++begin;
                    }
                }
                while(j < len - 2 && nums[j+1] == nums[j])    ++j;
                ++j;
            }
            while(i < len - 3 && nums[i+1] == nums[i])  ++i;
            ++i;
        }
        return result;
    }
};

更新会同步在我的网站更新(https://zergzerg.cn/notes/webnotes/leetcode/index.html)

猜你喜欢

转载自blog.csdn.net/u013434984/article/details/83930746