四数之和
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
思路
- 对给定vector排序,先固定两个数,然后创建一个临时数组来存除去这两个数的其他数字。
- 对新创建数组,采用双指针来判断和是否等于target - 前面两个数字之和。找到了,就放到一个set<vector>里面,让set自动完成去重。left++, right–,直到left >= right。
- 最后新创建vector<vector>,采用assign方法来将set中元素复制到vector里面。
代码
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
set<vector<int>> resVec;
vector<vector<int>> ans;
if (nums.size() < 4) {
return ans;
}
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 1; i++) {
for (int j = i + 1; j < nums.size(); j++) {
int currentSum = nums[i] + nums[j];
int needSum = target - currentSum;
vector<int> tempVec(nums.size() - 2); // 去除nums[i] 和 nums[j] 拷贝到临时数组
int index = 0;
for (int k = 0; k < nums.size(); k++) {
if (k == i || k == j) {
;
} else {
tempVec[index++] = nums[k];
}
}
int left = 0, right = tempVec.size() - 1;
while (left < right) {
if (tempVec[left] + tempVec[right] > needSum) {
right--;
} else if (tempVec[left] + tempVec[right] < needSum) {
left++;
} else {
vector<int> ivec(4);
ivec[0] = nums[i];
ivec[1] = nums[j];
ivec[2] = tempVec[left];
ivec[3] = tempVec[right];
sort(ivec.begin(), ivec.end());
resVec.insert(ivec);
left++;
right--;
}
}
tempVec.clear();
}
}
ans.assign(resVec.begin(), resVec.end());
return ans;
}
};