美文网首页
每天一题LeetCode【第13天】

每天一题LeetCode【第13天】

作者: 草稿纸反面 | 来源:发表于2017-02-02 00:00 被阅读285次

T15. 3 Sum【Medium

题目

给一个有 n 个整数的数组 S,找到 S 中的所有和为 0 的三元组(S 中元素 a,b,c 使得 a+b+c = 0 )。

注意:解集不能包含重复的三元组。

举个例子,如果给出数组 S = [-1, 0, 1, 2, -1, -4],

一个解集是
[
  [-1, 0, 1],
  [-1, -1, 2]
]

思路

具体可以看代码注释~

代码

代码取自 Top Solution,稍作注释

public List<List<Integer>> threeSum(int[] num) {
    //调用方法对它进行排序
    Arrays.sort(num);
    //新建一个List,泛型是泛型为Integer的List
    List<List<Integer>> res = new LinkedList<>(); 
    //主要代码
    for (int i = 0; i < num.length-2; i++) {
        //num[i] != num[i-1]来排除重复
        if (i == 0 || (i > 0 && num[i] != num[i-1])) {
            //先把num[i]取反,然后通过lo,还有hi的移动来确定结果
            int lo = i+1, hi = num.length-1, sum = 0 - num[i];
            while (lo < hi) {
                //相等时
                if (num[lo] + num[hi] == sum) {
                    //添加入res
                    res.add(Arrays.asList(num[i], num[lo], num[hi]));
                    //通过while num[lo] == num[lo+1] 跳过重复的
                    while (lo < hi && num[lo] == num[lo+1]) lo++;
                    while (lo < hi && num[hi] == num[hi-1]) hi--;
                    //在sum相同时当前lo和hi都不可能了,于是同时向内移动一个
                    lo++; hi--;
                }
                //若和小于sum,则和要增加,所以lo++ 
                else if (num[lo] + num[hi] < sum) lo++;
                //若和大于sum,则和要减少,所以hi-- 
                else hi--;
           }
        }
    }
    return res;
}

补充

List 中的泛型:

为什么要说这个呢,因为题中的 List<List<Integer>> 就用到了泛型

例如List<E>,这其中 E 表示 List 集合中元素的类型。

其中 E 可以是 int,String,也可以是自己写的类,在处理一类的数据时总是可以用到,比如安卓的ListView

相关文章

网友评论

      本文标题:每天一题LeetCode【第13天】

      本文链接:https://www.haomeiwen.com/subject/uailittx.html