这道题很简单 就是在数组中找到3个数和为0就行 且不可以重复
题解:
本题题解就是在一个数组里面寻找三个数和为0的数组 输出这些数组
解题思路 排序 然后去重 之后 定一个数(复数)然后再定两个数一个从
从最右边一个从定的第一个数的下一个数
这样开始遍历 当定的数大于0三数之和无法等于0
当左边那个和其后面的数重复就是给下标+1
右边的和其前面的数重复就是给下标-1
具体代码实现
package Leetcode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/*
* 本题题解就是在一个数组里面寻找三个数和为0的数组 输出这些数组
* 解题思路 排序 然后去重 之后 定一个数(复数)然后再定两个数一个从
* 从最右边一个从定的第一个数的下一个数
* 这样开始遍历 当定的数大于0三数之和无法等于0
* 当左边那个和其后面的数重复就是给下标+1
* 右边的和其前面的数重复就是给下标-1
*
*
* */
public class Demo13 {
public static List<List<Integer>> threesum(int [] nums){
List<List<Integer>> ans=new ArrayList<>();
int len=nums.length;
if(nums==null||len<3) return ans;
Arrays.sort(nums);
for (int i = 0; i < len; i++) {
if(nums[i]>0) break;
if(i>0&&nums[i]==nums[i-1]) continue;//这个去重只能避免这个数不和前面的数一样
//不能避免在判断是后面的数和前面的数相同
int L=i+1;
int R=len-1;
while (L<R){
int sum=nums[i]+nums[L]+nums[R];
if(sum==0){
ans.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 if (sum>0) R--;
}
}
return ans;
}
public static void main(String[] args) {
int[] a={-1,-1,0,0,1,1,2,2};
List<List<Integer>> threesum1 = threesum(a);
Iterator<List<Integer>> iterator = threesum1.iterator();
while (iterator.hasNext()) System.out.println(iterator.next());
}
}