地址
https://leetcode-cn.com/problems/3sum/submissions/
描述
思路
问题:
1、试探算法:怎么实现尽可能找最小的k?(算法思想值得学习)
假如k-1>j,就说明k的左边相邻数任然>j,没有越界,且nums[i]+nums[j]+nums[k-1]>=0,那么k指针就向左移动,达到尽可能小的目的。
2、 i 指针需要跳过我理解了,为什么 j 指针也要?
举出反例
少了这句:
出现重复
代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;//答案数组
//使用双指针算法,一定要先进行排序
sort(nums.begin(),nums.end());
//指针i<j<k
for(int i=0;i<nums.size();i++){
//这个数与前面与之相邻的数相同,跳过,防止出现重复
if(i>0&&nums[i-1]==nums[i]) continue;
for(int j=i+1,k=nums.size()-1;j<k;j++){
//防止重复
if(j>i+1&&nums[j]==nums[j-1]) continue;
//试探算法,尽可能找最小的k
while(k-1>j&&nums[i]+nums[j]+nums[k-1]>=0) k--;
if(nums[i]+nums[j]+nums[k]==0) res.push_back({
nums[i],nums[j],nums[k]});
}
}
return res;
}
};