15. 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
思考
这里使用排序 + 双指针
-
如果
nums
的长度小于3,返回[]
-
对数组进行排序,然后进行遍历时的指针
i
、左指针leftPoint
初始化指向i+1
、右指针rightPoint
初始化指向nums.lenth-1
,这里遍历一个i
时,不能与上一个元素相同,否则会重复添加- 接下来寻找与指针
i
指向的数之和等于0
的数,移动leftPoint
和rightPoint
- 如果
leftPoint>=rigthPoint
,指针i
移动,重新初始化leftPoint
和rightPoint
- 如果三个指针指向的数之和等于
0
,则添加到lists
,并且继续移动左右指针- 这里继续移动左右指针时,为了避免重复,移动指针时下一个元素不能与当前元素相同
- 如果三个指针指向的数之和小于
0
,则leftPoint++
- 如果三个指针指向的数之和大于
0
,则rigthPoint--
- 接下来寻找与指针
package 力扣;
import java.time.Instant;
import java.util.*;
/**
* @author yyq
* @create 2022-03-17 10:05
*/
public class leetcode15 {
public static void main(String[] args) {
int[] nums=new int[]{-1,0,1,2,-1,-4};
threeSum(nums);
}
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> lists=new ArrayList<>();
if(nums.length<3) return null;
Arrays.sort(nums);
if(nums[0]>0) return null;
for (int i = 0; i < nums.length; i++) {
if(nums[i]>0) break;
if(i>0&&nums[i-1]==nums[i]) continue;
int leftPoint=i+1;
int rightPoint=nums.length-1;
while(true){
if(leftPoint>=rightPoint) break;
if(nums[i]+nums[leftPoint]+nums[rightPoint]==0){
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[leftPoint]);
list.add(nums[rightPoint]);
lists.add(list);
while(true){
if(nums[leftPoint+1]==nums[leftPoint]&&leftPoint<rightPoint){
leftPoint++;
continue;
}
else {
leftPoint++;
break;
}
}
while(true){
if(nums[rightPoint]==nums[rightPoint-1]&&rightPoint>leftPoint){
rightPoint--;
continue;
}else {
rightPoint--;
break;
}
}
continue;
}
if(nums[i]+nums[leftPoint]+nums[rightPoint]<0&&rightPoint>leftPoint){
leftPoint++;
continue;
}
if(nums[i]+nums[leftPoint]+nums[rightPoint]>0&&rightPoint>leftPoint){
rightPoint--;
continue;
}
}
}
return lists;
}
}