去重用的hashmap,结果发现超时,还是得硬去。
难点在于剪枝和去重,很容易超时。再一个就是LeetCode的测试用例,达到了int的取值极限,要强转一下类型。
//双指针法找符合条件的元组
//用hashmap去重
class Solution {
public:
vector<vector> fourSum(vector& nums, int target)
{
vector<vector<int>> ans;//存不重复的四元组
if (nums.size() < 4)
return ans;
int left = 0, right = 0;
sort(nums.begin(), nums.end());//先把数组排序
for (int i = 0; i < nums.size() - 3; i++)//双循环确定四个数中的其中两个
{
if (nums[i] > target && nums[i] >= 0)//第一个数就大于target且为正数,后面肯定不存在;
break;
if (i > 0 && nums[i] == nums[i - 1])
continue;
for (int j = i + 1; j < nums.size() - 2; j++)
{
if (nums[i] + nums[j] > target && nums[i] + nums[j] >= 0)//剪枝2
break;
//双指针找到符合条件的剩下两个数的组合
left = j + 1;
right = nums.size()-1;
while (left < right)
{
long long sum = (long long)nums[i] + nums[j] + nums[left] + nums[right];
if (sum == target)
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[left]);
temp.push_back(nums[right]);
if (Judge(ans, temp))
{
ans.push_back(temp);
}
++left;
}
else if (sum > target)
{
--right;
}
else
{
++left;
}
}
}
}
return ans;
}
//去重函数
bool Judge(vector<vector<int>> ans,vector<int>& temp)
{
int flag = 1;
for (int i = 0; i < ans.size(); i++)
{
unordered_map<int, int> Map;
for (int j = 0; j < 4; j++)
{
Map[ans[i][j]]++;
Map[temp[j]]--;
}
if (Map[temp[0]] == 0 && Map[temp[1]] == 0 && Map[temp[2]] == 0 && Map[temp[3]] == 0)
return false;
}
return true;
}
};