力扣刷题笔记【双指针】 → 15. 三数之和

206 阅读1分钟

这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

题目

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

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

示例

输入: nums = [-1,0,1,2,-1,-4]
输出: [[-1,-1,2],[-1,0,1]]
输入: nums = []
输出: []
输入: nums = [0]
输出: []

提示

  • 0 <= nums.length <= 3000
  • -10^5 <= nums[i] <= 10^5

解题思路

排序 + 双指针

要寻找数组中三个相加为0的元素,我们可以先对数组进行排序,利用其有序性,便于我们采用双指针对解法来求得结果。

解题步骤如下:

  1. 对数组进行排序;
  2. 定义a,b,c三个指针;
  3. 固定其中一个指针,剩余两个指针采用双指针解法来搜索答案;
  4. 保存结果。
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        int n = nums.length;
        // 边界判断,长度小于3直接返回
        if(n < 3){
            return list;
        }
        
        // 数组排序
        Arrays.sort(nums);
        
        // 遍历a指针,在后续对元素中找到b,c相加为0
        for(int a = 0; a < n - 2; ++a){
            // 题目要求不能包含重复的三元组,这里需要做个去重判断
            if(a > 0 && nums[a] == nums[a - 1]){
                continue;
            }
            
            // b,c指针分别对于首尾两个方向
            int b = a + 1, c = n - 1;
            // 终止条件
            while(b < c){
                // 去重判断,前面对左边做了去重判断,这里要对右边做去重判断
                if(c < n - 1 && nums[c] == nums[c + 1]){
                    --c;
                // 找到目标值,将其加入结果集
                }else if(nums[b] + nums[c] == -nums[a]){
                    List<Integer> tmp = new ArrayList();
                    tmp.add(nums[a]);
                    tmp.add(nums[b]);
                    tmp.add(nums[c]);
                    list.add(tmp);
                    --c;
                // 大于0则右边指针左移
                }else if(nums[b] + nums[c] > -nums[a]){
                    --c;
                // 小于0则左边指针右移
                }else{
                    ++b;
                }
            }
        }
        // 返回结果
        return list;
    }
}

 复杂度分析

  •   时间复杂度:O(N2)O(N^2)
  •   空间复杂度:O(logN)O(logN)

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处: leetcode-cn.com/problems/3s…