3Sum

来源:互联网 发布:优化布林线 编辑:程序博客网 时间:2024/06/17 15:16

原题链接
给一个拥有n个元素的数组S,S中是否会有a,b,c三个元素使得a+b+c=0?寻找出满足该条件的所有唯一三元组。
Note: 答案中必须不能含有重复的三元组

class Solution {    public List<List<Integer>> threeSum(int[] num) {        //先排序        Arrays.sort(num);        //创造序列        List<List<Integer>> res = new LinkedList<>();         for (int i = 0; i < num.length-2; i++) {            //遍历序列            //i > 0 && num[i] != num[i-1] 如果不是开头则需要额外判断,避免重复的元素开头            if (i == 0 || (i > 0 && num[i] != num[i-1])) {                //类似二分法移动索引                int lo = i+1, hi = num.length-1, sum = 0 - num[i];                while (lo < hi) {                    //如果求和正好为sum                    if (num[lo] + num[hi] == sum) {                        //答案加入结果序列                        res.add(Arrays.asList(num[i], num[lo], num[hi]));                        //避免重复元素添加进结果集,变相去重                        while (lo < hi && num[lo] == num[lo+1]) lo++;                        while (lo < hi && num[hi] == num[hi-1]) hi--;                        //while循环会多加减一次,反操作                        lo++; hi--;                    }                     //如果求和小于0, 增大lo索引,使得求和变大                    else if (num[lo] + num[hi] < sum) lo++;                    //反之减少hi索引,使得求和变小                    else hi--;               }            }        }        return res;    }}
本解法:时间复杂度O(N^2)
原创粉丝点击