Leetcode 15. 三数之和

Leetcode 15. 3Sum

难度

中等

题目

https://leetcode-cn.com/problems/3sum/

思路

双指针

本题最关键的是如何去除重复解。

首先,如果数组长度小于3,返回空

按从小到大顺序排序数组。

如果长度大于等于3

在遍历数组的过程中维护一个left和right

left = i + 1, right = nums.length

如果num[i] > 0,也即是后面都是大于0的,返回结果。

其次,如果nums[i]与nums[i - 1]相等,也就是nums[i]这个值之前已经判断过,continue。

如果发现了nums[i] + nums[left] + nums[right] == 0,将其加入结果中。并通过下面步骤去重。

如果nums[left] == nums[left + 1],结果重复,left += 1

right类似。

solution

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();
        if (nums.length < 3) {
            return res;
        }
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0)
                return res;
                if (i > 0 && nums[i] == nums[i - 1])
                    continue; //第一个为nums[i]的值已经判断过
            int left = i + 1;
            int right = nums.length - 1;
            while (left < right) {
                if (nums[i] + nums[left] + nums[right] == 0) {
                    res.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    while (left < right && nums[left] == nums[left + 1])
                        left += 1;
                    while (left < right && nums[right] == nums[right - 1])
                        right -= 1;
                    left += 1;
                    right -= 1;
                } else if (nums[i] + nums[left] + nums[right] > 0)
                    right -= 1;
                else
                    left += 1;
            }
        }
        return res;
    }
}

 

上一篇:养猪日记 2022.1.15


下一篇:【2022/1/15】thinkphp源码无差别阅读(二十)