题目描述
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组
注意:答案中不可以包含重复的三元组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码实现
package com.zcl.数组;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* Author:markusZhang
* VM Args:
* Date:Create in 2020/2/1 15:09
*/
public class 三数之和 {
/*
这个题比较难理解一点了,我逐行解释一下
*/
public List<List<Integer>> threeSum(int[] nums) {
//声明一个题目要求返回类型的集合
List<List<Integer>> aList = new ArrayList<>();
//先对数组进行一次排序,然后再采用双指针的思想
Arrays.sort(nums);
//对数组进行遍历,以i为基准作为第一个数的索引
for(int i=0;i<nums.length-2;i++){
//因为这本来就是一个排序数组了,如果第一个数值就大于0,那就没有遍历的必要了
if(nums[i]>0){
break;
}
//这是为了防止在前一个元素已经与当前元素后面的元素达成等于0的条件被放入集合中
// ,听着有点绕口,就是去重,你细品
if(i>0 && nums[i]==nums[i-1]){
continue;
}
//这里就开始采用双指针算法思想了,不懂双指针的可以去看下双指针算法思想。
int L = i+1;
int R = nums.length-1;
while(L<R){
int sum = nums[i]+nums[L]+nums[R];
if(sum==0){
aList.add(Arrays.asList(nums[i],nums[L],nums[R]));
//这块应该注意一下,为了除去相同元素,而进行的。防止出现相同序列被加入到集合中去。去重
while(L<R && nums[L]==nums[L+1]){
L++;
}
while(L<R && nums[R]==nums[R-1]){
R--;
}
L++;
R--;
}else if(sum<0){
L++;
}else{
R--;
}
}
}
return aList;
}
public static void main(String[] args) {
int numbers[] = {-1, 0, 1, 2, -1, -4};
List list = new 三数之和().threeSum(numbers);
System.out.println(list.size());
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}