LeetCode 15

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

我做这个题的感觉正如讨论区中第一赞说的那样。。因为以前做过2sum的题,所以下意识考虑使用两个循环,把问题转变成2sum的类型,但是发现做出来很有问题。所以就去看了讨论区的说法。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 0;i<nums.length-2;i++){
            if(i == 0 || (i>0 && nums[i] != nums[i-1])){
                int l = i+1;
                int r = nums.length-1;
                int sum = 0-nums[i];
                while(l<r){
                    if(nums[l]+nums[r] == sum){
                        result.add(Arrays.asList(nums[i],nums[l],nums[r]));
                        while(l<r && nums[l] == nums[l+1]){
                            l++;
                        }
                        while(l<r && nums[r] == nums[r-1]){
                            r--;
                        }
                        l++;
                        r--;
                    }else if(nums[l]+nums[r]<sum){
                        while(l < r &&nums[l] == nums[l+1]){
                            l++;
                        }
                        l++;
                    }else{
                        while(l < r &&nums[r] == nums[r-1]){
                            r--;
                        }
                        r--;
                    }
                }
            }
        }
        return result;
    }

}
View Code

首先先对原数组进行排序,这是基本操作。

然后使用一个指针,来访问开始的位置。

这里使用到了一个技巧以避免出现T的问题

 if(i == 0 || (i>0 && nums[i] != nums[i-1]))

这个是为了防止第一个元素就出现相同的情况。

下面如果找到l r满足nums[i]+nums[l]+nums[r] == 0的情况,就直接加入result这个list中,然后让l r分别寻找到下一个不同的元素然后再来作比较。这个思想有点像之前做的那个最大的盛水容器的题。

原文地址:https://www.cnblogs.com/ZJPaang/p/12726315.html