LeetCode 18. 4Sum

来源:互联网 发布:口腔医学网络教育 编辑:程序博客网 时间:2024/06/05 10:35

4Sum


题目描述:

Given an array S of n integers, are there elements abc, 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]]


题目大意:

给定一个数组nums和一个数字target,找出nums中4个数的和为target的所有情况。注意不能有重复情况。
《3Sum》是通过固定第一个数字,然后用两个指针。
那么《4Sum》我们可以固定第一第二个数字(通过两层循环实现),然后用两个指针。
没做过《3Sum》建议先做一下。点击打开链接


题目代码:

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