15 三数之和(排序 +三指针)

1. 问题描述:

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum

2. 思路分析:

① 题目还是很好理解的,之前是先做了领扣的一道四数之和的题目,使用的是四个指针的做法,这道题目与之前四个指针的做法类似,所以可以使用三个指针的做法来做,假如使用其他的做法来做比较麻烦而且很容易超时,比如像递归数据小的话可以求解出来,假如像领扣中的最后一两千个数据肯定是扛不住的,肯定会超时,而且递归的话去重很麻烦其中可能存在很多重复的数据

② 首先需要对数组进行排序,这样在后面取出元素与判断是否重复才好判断,一开始的时候第一个指针指向的是第一个元素的位置,第二个指针指向的是第二个元素的位置,也就是下一个元素的位置,第三个指针指向的是最后一个元素的位置,之后在循环中这些位置会往下进行移动,需要注意的是题目要求解的是不重复的数字,所以需要再循环中先判断去重,因为当元素相同的时候,取出哪一个元素相加的都是一样的

③ 假如当前的a、b、c三个位置相加的元素小于0那么b指针向右移动一位,大于0那么c往左移动一位,在移动的时候需要保证b小于c,这样三个数字的位置才是正确的,当相加的结果等于0的时候那么需要先去下一个与元素b与c重复的元素(保证下一个取出的b和c位置的元素是不重复的),b右移,c左移一位

④ 所以在一开始的时候a位置的元素需要去重,但是一开始b位置不需要去重,因为b位置在后面相加元素等于0的时候会去重,所以在一开始去b位置的重的时候与后面在元素等于0的时候回导致重复判断所以会超时,我在一开始的时候也是去了b元素的重但是发现提交上去最后两个测试数据超时了在一开始的时候不能够去b位置的重

3. 代码如下:

class Solution {
   public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        int len = nums.length;
        for (int a = 0; a <= len - 3; ++a){
            //优化
            if (nums[a] > 0) return res;
            //去重
            if (a > 0 && nums[a] == nums[a - 1]) continue;
            int b = a + 1, c = len - 1;
            while (b < c){
                int target = nums[a] + nums[b] + nums[c];
                if (target < 0) ++b;
                else if (target > 0) --c;
                else {
                    List<Integer> newEle = new ArrayList<>();
                    newEle.add(nums[a]);
                    newEle.add(nums[b]);
                    newEle.add(nums[c]);
                    res.add(newEle);
                    //去重
                    while (b < c && nums[b] == nums[b + 1]) ++b;
                    //去重
                    while (b < c && nums[c] == nums[c - 1]) --c;
                    ++b;
                    --c;
                }
            }
        }
        return res;
    }
}
发布了569 篇原创文章 · 获赞 153 · 访问量 59万+

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/105375258