您的位置:首页 > 其它

【LeetCode】18. 4Sum

2017-02-27 11:55 489 查看

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]
]


解题思路

双指针问题。

思路还是与3Sum问题相似。差异在于,此处是依次固定第一和第二个数字,然后通过双指针移动控制第三和第四个数字;而3Sum则只需固定第一个数字。

注意:要仔细分析所有while循环的控制条件,防止出现死循环。

AC代码

class Solution {
public:
vector<vector<int> > fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int> > ans;
const int vSize = nums.size();
//fix the first number
for (int first = 0; first < vSize - 3; ++first) {
//fix the second number
for (int second = first + 1; second < vSize - 2; ++second) {
int third = second + 1;
int forth = vSize - 1;
while (third < forth) {
int curSum = nums[first] + nums[second] + nums[third] + nums[forth];

if (curSum < target)
third++;
else if (curSum > target)
forth--;
else {
vector<int> tempAns;
//注意此处push_back的是数值nums[first],而非下标first
tempAns.push_back(nums[first]);
tempAns.push_back(nums[second]);
tempAns.push_back(nums[third]);
tempAns.push_back(nums[forth]);
ans.push_back(tempAns);

//此处不可以直接写nums[third+1]==nums[third]
//因为要确保third一定会被更新到
while (third < forth && nums[third] == tempAns[2]) third++;
while (third < forth && nums[forth] == tempAns[3]) forth--;
}
}
while (second < vSize - 1 && nums[second + 1] == nums[second]) second++;
}
while (first < vSize - 1 && nums[first + 1] == nums[first]) first++;
}

return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode