力扣热题100—15三数之和
混到大三啦,这学期开始为明年的春季实习做准备,记录一下。
实现:利用双指针进行双层循环即可
要点①:要求不能是重复数组则不能简单三重循环遍历,需要跳过重复的枚举。
要点②:为了使不重复则预排序使i<j<k,其中j,k为双指针相向移动,当三数和大于0则k减少,直至找到一组值,然后变化j。i,j跳过重复枚举的值。
要点③:虽然只有O(N^2),但是注意k的赋值是在外层循环,这样才没有浪费双指针同时移动。
for(i=0;i<len-2;++i)
{
if(nums[i]>0)
return res;
if(i>0&&nums[i-1]==nums[i])
{
continue;
}
target=-nums[i];
k=len-1;
for(j=i+1;j<len-1;++j)
{
if(j>i+1&&nums[j-1]==nums[j])
continue;
while(j<k&&nums[j]+nums[k]>target)
{
--k;
}
if(j==k)
break;
if(nums[j]+nums[k]==target)
{
res.push_back({nums[i],nums[j],nums[k]});
}
}
}