问题描述
Given an array nums of n integers, are there elements a, b, c in nums 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.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
解法思路
首先想到的是枚举法,将序列从小到大排序,遍历所有可能情况,但结果显示超时。需要改进
**改进思路“
枚举情况下有三层循环,明显存在重复情况以及一些可以确定肯定不成立的情况。先构造一层循环,另外两个数从i+1和N两端开始搜索,针对不同的情况增大i+1或者减小N,构造while循环。
C++代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> result;
for(int i=0; i+2<nums.size(); i++){
if(i>0 && nums[i]==nums[i-1]) continue;
int target = -nums[i];
int j = i+1, k = nums.size()-1;
while(j<k){
int temp = nums[j] + nums[k];
if(temp<target){
j++;
}
if(temp == target){
result.push_back(vector<int>({nums[i],nums[j],nums[k]}));
while(j<k && nums[j]==nums[j+1]) j++;
while(j<k && nums[k]==nums[k-1]) k--;
j++; k--;
}
if(temp>target){
k--;
}
}
}
return result;
}
};
结果显示
Runtime: 92 ms, faster than 99.98% of C++ online submissions for 3Sum.
Memory Usage: 14.7 MB, less than 99.20% of C++ online submissions for 3Sum.