等于0的情况:0+0+0,正+负+0,正+正+负,正+负+负,所以三个相同的数能等于0的情况是只有3个0,所以重复的数有2个就够了,先通过hashmap去重,同一个数出现3次以上只取2次,有效次数和为新数组的长度。然后将新数组排序,正数之后不必计算了,通过三层循环计算和是否为0。
import java.util.*;
import java.util.stream.*;
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
if(num.length<3)return lists;
// hash
Map<Integer,Integer> map = new HashMap<>();
int size = 0;
for(int i=0;i<num.length;i++){
if(map.containsKey(num[i])){
map.put(num[i],map.get(num[i])+1);
if(map.get(num[i])<3)size++;
}else{
map.put(num[i],1);
size++;
}
}
// 判断是否有3个0
if(map.containsKey(0)&&map.get(0)>=3){
ArrayList<Integer> list = new ArrayList<>();
list.add(0);list.add(0);list.add(0);
lists.add(list);
}
int[] arr = new int[size];
int m = 0;
for(Integer key:map.keySet()){
int count = map.get(key)>2?2:map.get(key);
while(count>0){
arr[m++] = key;
count--;
}
}
Arrays.sort(arr);
for(int i=0;i<arr.length;i++){
if(arr[i]>0)break;
for(int j=i+1;j<arr.length;j++){
for(int k=j+1;k<arr.length;k++){
ArrayList<Integer> list = new ArrayList<>();
if(arr[i]+arr[j]+arr[k]==0){
list.add(arr[i]);
list.add(arr[j]);
list.add(arr[k]);
if(!lists.contains(list))
lists.add(list);
}
}
}
}
return lists;
}
}