LeetCode 15. 3Sum
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.
Notice that the solution set must not contain duplicate triplets.
Example 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Example 2:
Input: nums = []
Output: []
Example 3:
Input: nums = [0]
Output: []
Constraints:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
实现思路:
经典的双指针问题中的求和问题,基本方法就是for循环固定一个数,然后定义两个指针一个指向当前数的下一个,另一个指针指向最后一个数,将三数之和相加判断是否为0,不过要注意重复答案的去除方法,就像是窗口滑动一样,滑动前后元素值相等的元素来去重。
AC代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
if(nums.size()==0) return ans;
sort(nums.begin(),nums.end());
for(int i=0; i<nums.size(); i++) {//固定第一个数 然后遍历j、k指针
if(i>0&&nums[i]==nums[i-1]) continue;
int j=i+1;
int k=nums.size()-1;
while(j<k) {
if(nums[i]+nums[j]+nums[k]==0) {
ans.push_back({nums[i],nums[j],nums[k]});
j++;//移动j指针
k--;//移动k指针
while(j<k&&nums[j]==nums[j-1]) j++;//如果是j指针前后数值一样忽略
while(j<k&&nums[k]==nums[k+1]) k--;////如果是k指针前后数值一样忽略
} else if(nums[i]+nums[j]+nums[k]<0) {
j++;//如果三数之和小于0了说明j指针需要扩大
} else k--;
}
}
return ans;
}
};