LeetCode 15.三数之和

一、题目

二、解题

注:本文均是Java代码

1、相向双指针

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        // 不重复的三元组,输出三元组的顺序不重要
        // 数组如果有序可以使用相向双指针
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();
        int n = nums.length;
        for (int i = 0; i < n - 2; i++) {
            int x = nums[i];
            if (i > 0 && nums[i] == nums[i-1]) continue;
            int j = i + 1, k = n - 1;
            while (j < k) {
                int sum = x + nums[j] + nums[k];
                if (sum < 0) j++;
                else if (sum > 0) k--;
                else {
                    List<Integer> res = new ArrayList<>();
                    res.add(x); res .add(nums[j]); res.add(nums[k]);
                    result.add(res);
                    j++;
                    while (j < k && nums[j] == nums[j-1]) j++;
                    k--;
                    while (j < k && nums[k] == nums[k+1]) k--;
                }   
            }
        }
        return result;
    }
}

2、优化版本

做两个小优化。如果前三个数,也就是最小的三个数的和都大于0,那么可以直接结束循环,根本不存在等于0的三元组。如果x加上最后两个数的和都小于0,那么结束当次循环,这次循环不会有等于0的三元组,需要i++继续寻找。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        // 时间复杂度O(n^2),排序的忽略
        // 空间复杂度O(1)
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();
        // 注意n的范围,否则可能数组越界
        int n = nums.length;
        for (int i = 0; i < n - 2; i++) {
            int x = nums[i];
            // 注意这不能是while,否则可能数组越界
            if (i > 0 && nums[i] == nums[i-1]) continue;
            if (nums[i] + nums[i+1] + nums[i+2] > 0) break;    // 优化一
            if (nums[i] + nums[n-2] + nums[n-1] < 0) continue;    // 优化二
            int j = i + 1, k = n - 1;
            while (j < k) {
                int sum = x + nums[j] + nums[k];
                if (sum < 0) j++;
                else if (sum > 0) k--;
                else {
                    List<Integer> res = new ArrayList<>();
                    res.add(x); res .add(nums[j]); res.add(nums[k]);
                    result.add(res);
                    j++;
                    // 注意这不能是if,否则有的重复数没有检索到加入到循环,有重复
                    while (j < k && nums[j] == nums[j-1]) j++;
                    k--;
                    while (j < k && nums[k] == nums[k+1]) k--;
                }   
            }
        }
        return result;
    }
}

3、说明

参考视频:两数之和 三数之和【基础算法精讲 01】_哔哩哔哩_bilibili

相关推荐

  1. LeetCode-15. 之和

    2024-04-08 14:34:02       44 阅读
  2. [LeetCode] 15. 之和

    2024-04-08 14:34:02       43 阅读
  3. LeetCode 15 之和

    2024-04-08 14:34:02       40 阅读
  4. leetcode15. 之和

    2024-04-08 14:34:02       37 阅读
  5. Leetcode15. 之和

    2024-04-08 14:34:02       34 阅读
  6. LeetCode 15. 之和

    2024-04-08 14:34:02       31 阅读

最近更新

  1. 银河麒麟(V10SP1)-arm版交叉编译-qt-5.12.12源码

    2024-04-08 14:34:02       0 阅读
  2. 华为机考真题 -- 游戏分组

    2024-04-08 14:34:02       0 阅读
  3. Linux 期末速成(知识点+例题)

    2024-04-08 14:34:02       0 阅读
  4. 【基础篇】1.8 C语言基础(二)

    2024-04-08 14:34:02       0 阅读
  5. element ui form添加校验规则

    2024-04-08 14:34:02       1 阅读
  6. splice方法的使用#Vue3

    2024-04-08 14:34:02       1 阅读
  7. 使用Dockerfile和ENTRYPOINT运行Python 3脚本

    2024-04-08 14:34:02       1 阅读
  8. 黑龙江等保测评对中小企业成本效益分析

    2024-04-08 14:34:02       1 阅读

热门阅读

  1. golang变量初始化顺序

    2024-04-08 14:34:02       17 阅读
  2. 面试前端八股文十问十答第十期

    2024-04-08 14:34:02       16 阅读
  3. 掌握 SQL 左连接:从入门到精通

    2024-04-08 14:34:02       12 阅读
  4. C语言——自定义类型

    2024-04-08 14:34:02       14 阅读
  5. ‘-->‘ operator in C/C++?

    2024-04-08 14:34:02       13 阅读
  6. Spring Boot的主要特点

    2024-04-08 14:34:02       13 阅读
  7. leetode 加一

    2024-04-08 14:34:02       11 阅读
  8. idea常用配置——注释快捷键

    2024-04-08 14:34:02       15 阅读
  9. (26)4.7 字符函数和字符串函数

    2024-04-08 14:34:02       11 阅读
  10. 网络空间安全攻防平台搭建

    2024-04-08 14:34:02       15 阅读