题目
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
题意
给出一个数组,找出数组中任意三个和为0的数,得到的集合里面不能包括重复的三元组。比如,给出数组S = [-1, 0, 1, 2, -1, -4],
解法是:
[
[-1, 0, 1],
[-1, -1, 2]
]
分析
这道题可以用深度搜索,考虑到深度只为3,我做了简化,首先选定第一个数one,那么剩下的两个数two、three符合条件,-one = two+three。考虑到two和three是数组中不同下标的值,可以分别从给出数组头和尾部往中间找。
时间复杂度为O(n*n)
注意:解集不能存在重复的三元组。
代码
void findSum(vector<int>& nums,vector<vector<int>> &result,int target, int index){
int two=index+1, three =nums.size()-1;
while(two<three){
if(nums[index]+nums[two]+nums[three]==target){
vector<int> temp = {nums[index],nums[two],nums[three]};
result.push_back(temp);
while (two < three && nums[two] == temp[1]) two++;
while (two < three && nums[three] == temp[2]) three--;
}
else if(nums[index]+nums[two]+nums[three]>target)
three--;
else if(nums[index]+nums[two]+nums[three]<target)
two++;
}
while (index + 1 < nums.size() && nums[index + 1] == nums[index])
index++;
if(index<nums.size()-2)
findSum(nums, result, target,index+1);
}
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size()<3)
return result;
std::sort(nums.begin(), nums.end());
findSum(nums,result,0,0);
return result;
}
313 / 313 test cases passed.
Status: Accepted