题意:给你一个数组,找出所有不重复的由4个数组成的集合,使得4个数组加和等于target。
题解:记得找a+b = target吗?对a进行hash然后找target - b,这里也hash,只不过是对a+b进行hash,然后找target - c - d。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int n = nums.size();
sort(nums.begin(),nums.end());
vector<vector<int>> ans;
ans.clear();
unordered_map<int,vector<pair<int,int>> > hash;
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++)
hash[nums[i] + nums[j]].push_back(make_pair(i,j));
for(int i = 0; i < n - 3; i++)
{
if(i > 0 && nums[i] == nums[i - 1]) continue;
for(int j = i + 1; j < n - 2; j++)
{
if(j > i + 1 && nums[j] == nums[j - 1]) continue;
if(hash.find(target - nums[i] - nums[j]) != hash.end())
{
vector<pair<int,int> >& tmp = hash[target - nums[i] - nums[j]];
bool flag = true;
for(int k = 0; k < tmp.size(); k++)
{
if(tmp[k].first <= j) continue;
if(!flag && ans.back()[2] == nums[tmp[k].first]) continue;
ans.push_back(vector<int>{nums[i],nums[j],nums[tmp[k].first],nums[tmp[k].second]});
flag = false;
}
}
}
}
return ans;
}
};