自学内容网 自学内容网

【LeetCode】【算法】15. 三数之和

LeetCode 15. 三数之和

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

思路

思路:首先可以对数组做排序Arrays.sort(nums),便于寻找合适的解

  1. 遍历三个数即可。遍历技巧为:
    I. for循环,定义i=0,遍历第一个数
    II. left=i+1作为第二个数,right=nums.length-1作为第三个数
  2. while (left < right)不断循环,分为三种条件逼近结果,实际上leftright就类似于双指针:
    I. if ((nums[i]+nums[left]+nums[right]) > 0){right--;} // 右侧逼近
    II. else if ((nums[i]+nums[left]+nums[right]) < 0) {left++;} // 左侧逼近
    III. else 保存解,同时在else中,对于重复数也可以用两个while循环去除,避免重复遍历添加重复结果

代码

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        // 数组排序
        Arrays.sort(nums);
        if (nums[0] > 0) return list;
        for (int i = 0; i < nums.length; i++) {
            if (i > 0 && nums[i] == nums[i-1]){
                continue;
            }
            int left = i + 1;
            int right = nums.length - 1;
            
            while (left < right){
                if ((nums[i] + nums[left] + nums[right]) > 0){
                    right--;
                } else if ((nums[i] + nums[left] + nums[right]) < 0){
                    left++;
                } else {
                    // 可以进行存储了,但是要注意去重
                    List<Integer> t = new ArrayList<>();
                    t.add(nums[i]);
                    t.add(nums[left]);
                    t.add(nums[right]);
                    list.add(t);
                    while (right > left && nums[right] == nums[right - 1]) right--;
                    while (right > left && nums[left] == nums[left + 1]) left++;
                    right--;
                    left++;
                }
            }
        }
        return list;
    }
}

原文地址:https://blog.csdn.net/passer__jw767/article/details/143687221

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!