Problem
Question
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,完成
Code
class Solution {
public:
vector<std::vector<int>> result;
vector<int> temp;
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
if (i == 0 or nums[i] != nums[i-1]) {
std::vector<int> newN(nums.begin()+1+i, nums.end());
auto tS = threeSum(newN, target-nums[i]);
for (auto v : tS) {
v.push_back(nums[i]);
result.push_back(v);
}
}
}
return result;
}
vector<vector<int>> threeSum(vector<int>& nums, int target) {
vector<std::vector<int>> result;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
if (binary_search(nums.begin(), nums.begin()+i, nums[i]) == false) {
for (int j = i+1; j < nums.size(); j++) {
if (binary_search(nums.begin()+i+1, nums.begin()+j, nums[j]) == false &&
binary_search(nums.begin()+j+1, nums.end(), target-nums[i]-nums[j]) == true) {
int seq[] = {nums[i], nums[j], target-nums[i]-nums[j]};
std::vector<int> v(seq, seq+3);
result.push_back(v);
}
}
}
}
return result;
}
};