leetcode 18. 四数之和(4Sum)

题目描述:

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

解法:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        int sz = nums.size();
        vector<vector<int>> res;
        if(sz < 4){
            return res;
        }else{
            sort(nums.begin(), nums.end());
            // -2 -1 0 0 1 2
            int ll = 0, l = 1;
            int r = 2, rr = sz-1;
            while(ll < sz){
                l = ll + 1;
                while(l < sz){
                    int val = nums[ll] + nums[l];
                    r = l + 1;
                    rr = sz - 1;
                    while(r < rr){
                        int sum_val = val + nums[r] + nums[rr];
                        if(sum_val == target){
                            res.push_back({nums[ll], nums[l], nums[r], nums[rr]});
                            r++;
                            while(r < rr && nums[r] == nums[r-1]){
                                r++;
                            }
                            rr--;
                            while(r < rr && nums[rr] == nums[rr+1]){
                                rr--;
                            }
                        }else if(sum_val < target){
                            r++;
                            while(r < rr && nums[r] == nums[r-1]){
                                r++;
                            }
                        }else{
                            rr--;
                            while(r < rr && nums[rr] == nums[rr+1]){
                                rr--;
                            }
                        }
                    }
                    l++;
                    while(l < sz && nums[l] == nums[l-1]){
                        l++;
                    }
                }
                ll++;
                while(ll < sz && nums[ll] == nums[ll-1]){
                    ll++;
                }
            }
            return res;
        }
    }
};
posted @ 2019-04-10 15:30  zhanzq1  阅读(130)  评论(0)    收藏  举报