力扣15. 三数之和
Posted 蒙面侠1024
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣15. 三数之和相关的知识,希望对你有一定的参考价值。
原题链接
双指针算法:
定义两个指针,一个l,一个r
数组进行排序,从头开始遍历,因为数组现在已经是有序的了,分为下面三种情况
1.当nums[i]+nums[l]+nums[r]==0
,找到了一个答案,进行记录,此时i
是不动的,l
和r
指针向内收缩,寻找是否还有其他符合条件的数据。
2.当nums[i]+nums[l]+nums[r]<0
,因为r
已经是整个数组的最大值,三个数加起来还不是0的话,说明l
指向的数据太小了,所以l
向右移动;
3.当nums[i]+nums[l]+nums[r]>0
,减小r
的值,r
往左移。
整个答案会有重复的,所以前面使用了Set集合去重,最后转换为List再返回答案。
lass Solution
public List<List<Integer>> threeSum(int[] nums)
Arrays.sort(nums);
int n=nums.length;
Set<List<Integer>> res=new HashSet<>();
for(int i=0;i<n;i++)
int l=i+1;
int r=n-1;
while(l<r)
if(nums[i]+nums[l]+nums[r]==0)
res.add(Arrays.asList(nums[i],nums[l],nums[r]));
l++;
r--;
else if(nums[i]+nums[l]+nums[r]<0)
l++;
else
r--;
List<List<Integer>> ans=new ArrayList<>();
ans.addAll(res);
return ans;
以上是关于力扣15. 三数之和的主要内容,如果未能解决你的问题,请参考以下文章
力扣算法JS LC [383. 赎金信] LC [15. 三数之和]