[leetCode]15. 三数之和

在这里插入图片描述

排序 + 双指针

思路: 先将数组排序,再从数组中取出一个元素。使用两个指针从该元素之后取出一小一大两个元素,如果当前三个元素相加不为0,那么调整两个指针的位置继续求和。如果为0则将三个元素加入结果中。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> ans = new LinkedList<>();
        for (int i = 0; i < nums.length-2; ++i) {
            if (i > 0 && nums[i] == nums[i-1])
                continue;
            int small = i+1, big = nums.length-1;
            while (small < big) {
                List<Integer> one = new ArrayList<>();
                int sum = nums[i] +nums[small] + nums[big];
                if (small > i+ 1 && nums[small] == nums[small-1]) {
                    small++;
                    continue;
                }
                if (sum > 0) {
                    big--;
                } else if (sum < 0) {
                    small++;
                } else {
                    one.add(nums[i]);
                    one.add(nums[small]);
                    one.add(nums[big]);
                    ans.add(one);
                    small++;
                }
            }
        }
        return ans;
    }
}
posted @ 2020-10-04 16:02  消灭猕猴桃  阅读(60)  评论(0编辑  收藏  举报