题目:
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] ]思路及代码:
思路见代码的注释
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());//重点!
vector<vector<int>> ans;
int n = nums.size();
map<vector<int>, bool> hash;
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
int begin = j + 1, end = n - 1;
int m = target - nums[i] - nums[j];
while (begin < end)//双指针,一个只能向后一个只能向前,对于排过序的nums不会有遗漏
{
if (m == nums[begin] + nums[end])
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[begin]);
temp.push_back(nums[end]);
begin++;
end--;
/*if (hash.find(temp) == hash.end()){
hash[temp] = true;
ans.push_back(temp);
}*/
if (hash.count(temp)) {
continue;
}
hash[temp] = true;
ans.push_back(temp);
}
else if (m > nums[begin] + nums[end]){
begin++;
}
else{
end--;
}
}
}
}
return ans;
}
};