题解 | #数组中相加和为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;
}
海康威视公司氛围 920人发布