【双指针】LeetCode 15. 三数之和

题目链接

15. 三数之和

思路

可以借鉴 【双指针】LeetCode 167. 两数之和 II - 输入有序数组 的思路,将 nums[i] 作为 target,不断移动 jk 来达到目标。

去重的方法:通过判断 nums[j] == nums[j + 1]nums[k] == nums[k - 1] 来去重。

代码

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();

        for(int i = 0; i < nums.length; i++){
            if(nums[i] > 0){
                break;
            }
            if(i > 0 && nums[i] == nums[i - 1]){
                continue;
            }

            // start from index i + 1, because (nums[1], nums[2], num[3]) == (num[2], num[1], num[3])
            int j = i + 1;
            int k = nums.length - 1;
            while(j < k){
                int sum = nums[i] + nums[j] + nums[k];
                if(sum == 0){
                    result.add(Arrays.asList(nums[i], nums[j], nums[k]));
                    // deduplication
                    while(j < k && nums[j] == nums[j + 1]){
                        j++;
                    }
                    while(j < k && nums[k] == nums[k - 1]){
                        k--;
                    }
                    j++;
                    k--;
                }
                if(sum > 0){
                    k--;
                }else if(sum < 0){
                    j++;
                }
            }
        }

        return result;
    }
}

拓展

【双指针】LeetCode 16. 最接近的三数之和

posted @ 2023-01-29 16:10  Frodo1124  阅读(37)  评论(0编辑  收藏  举报