题解 | #数组中相加和为0的三元组#
数组中相加和为0的三元组
http://www.nowcoder.com/questionTerminal/345e2ed5f81d4017bbb8cc6055b0b711
时间-空间 都超过 95%
借助 Map 求结果
public ArrayList<ArrayList<Integer>> threeSum(int[] num) { Arrays.sort(num); // 存储数值和下标 HashMap<Integer,ArrayList<Integer>> map = new HashMap<>(); int key; for(int i=0;i< num.length;i++){ key = num[i]; ArrayList<Integer> list = map.getOrDefault(key,new ArrayList<>()); list.add(i); map.put(key,list); } ArrayList<ArrayList<Integer>> result = new ArrayList<>(); ArrayList<Integer> list; for(int i=0;i< num.length;i++){ //去重 if(i>0 && num[i] == num[i-1]){ continue; } for(int j=i+1;j<num.length;j++){ //去重 if(j>i+1 && num[j] == num[j-1]){ continue; } // 查找 map 中剩余的值 list = map.get(0 - num[i]-num[j]); if(list == null || list.size() == 0){ continue; } // 如果最大下标<= j说明 这一组解已经在前面计算出来了 ,解的下标是 i , list中的一个下标,j if(list.get(list.size()-1)<= j){ continue; } // 只有一个值,重复计算自己 if(list.size() == 1 && list.get(0) == j){ continue; } ArrayList<Integer> li = new ArrayList<Integer> (); li.add(num[i]); li.add(num[j]); li.add(num[list.get(0)]); result.add((li)); } } return result; }