三数之和(leetcode15排序,双指针)-------------------c++实现
题目表述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
样例
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
输入:nums = []
输出:[]
条件
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
思路
排序后
确定第一个数后
两个指针扫描,一个从前往后,一个从后往前
注意点
答案中不可以包含重复的三元组,但是三个元素的值可以相同(做的时候以为不能相同,所以耽误了1个多小时)。
而且当时思路错了
-1,-1,-1,0三个元素-1排序后并列,扫完第一个-1以后就可以扫坐标为0的序列了,当时的想法是:
-1,-1,2可以是,然后-1作为单个元素的时候也可以是其中的组合
但是其实第一个-1的时候已经把单个-1的组合可能扫完了。
ac代码
c++:
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& nums) {
vector<vector<int> > result;
int j,k;//第二位第三位的位置
sort(nums.begin(),nums.end());//排序
int i=0,jbefore,kbefore,target;
jbefore=100005,kbefore=100005;
int n = nums.size();
while(i<=(n-3)){
j=i+1,k=nums.size()-1;
if(i>0&&nums[i-1]==nums[i])
{
i++;
continue;
} //判断第一个数是否重复
if(nums[i]>0)
break;
target=0-nums[i];
while(j<k){
if(nums[k]+nums[j]==target)//如果有一样的就左右同时移动
{
if(!(nums[j]==jbefore&&nums[k]==kbefore))//不能和之前的一样
{
vector<int> x(3);
x[0]=nums[i],x[1]=nums[j],x[2]=nums[k];
jbefore=nums[j],kbefore=nums[k];
result.push_back(x);
}
j++;
k--;
}
else if(nums[k]+nums[j]<target) //小于左移
j++;
else //大于右移
k--;
}
i++;
}
return result;
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。