题解 | #数组中相加和为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;
    }
全部评论

相关推荐

点赞 评论 收藏
分享
06-18 13:28
已编辑
门头沟学院 Web前端
爱睡觉的冰箱哥:《给予你300的工资》,阴的没边了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务