题解 | #三数之和#

三数之和

http://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        if (num == null || num.length < 3) return new ArrayList<>(0);
        
        Arrays.sort(num);//排序处理,方便后面去重

        //存放原数组的相反数,key为原数组值,value为原数组下标。之所以用Map,是因为需要去重,保留最后一个下标的数即可。
        HashMap<Integer, Integer> map = new HashMap<>((int) (num.length / 0.75f + 0.5));
        
        for (int i = 0; i < num.length; i++) {//初始化相反数map集合
            map.put(Math.negateExact(num[i]), i);
        }

        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        for (int i = 0; i < num.length - 2; i++) {
            if (i != 0 && num[i] == num[i - 1]) continue;//同样的值,前面已经计算过了,跳过

            for (int j = i + 1; j < num.length - 1; j++) {
                if (j != i + 1 && num[j] == num[j - 1]) continue;//同样的值,前面已经计算过了,跳过

                int temp = num[i] + num[j];
                if (!map.containsKey(temp)) {
                    continue;
                }

                int k = map.get(temp);

                if (k > j) {
                    result.add(new ArrayList<>(Arrays.asList(num[i], num[j], num[k])));
                }
            }
        }

        return result;
    }
}

空间复杂度:O(n);时间复杂度:O(n^2)

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-11 17:10
什么素质,我请问呢,要掉小珍珠了。。。又憋屈又生气
Steven267:这不喷回去?花钱是大爷,记住这个道理
点赞 评论 收藏
分享
07-01 23:23
郑州大学 Java
否极泰来来来来:牛客迟早有高三的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 11:30
找工作7个月,投了7000封,3段世界五百强实习,才有一个offer,牛油们肯定比我强吧
码农索隆:不对不对不对,实习经历这么厉害,简历也没少投,问题出在哪呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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