Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • 每日算法

    • 信
    • 独一无二的出现次数
    • 按奇偶排序数组Ⅱ
    • 两数之和
    • 两数相加2
    • 寻找两个正序数组的中位数
    • 二叉树最大深度
    • 洗牌算法
    • 移动零
    • 数组元素排列组合
    • 上升下降字符
    • 最大间距
    • 四数相加2
    • 最大三角周长
    • 在排序数组中查找元素的起始位置
    • 最富有客户的资产总量
    • 打印规定循环字符串
    • 从m个数中选择n个数的组合
    • 复原IP地址
    • 有效的数独
    • 旋转图像
    • 缺失的第一个正整数
    • 第 N 个泰波那契数
    • 轮转数组
    • 爬楼梯
    • 斐波那契数列
    • 使用最小花费爬楼梯
    • 打家劫舍
    • 删除并获得点数
    • 颜色分类
    • 字母异分词分组
    • 加一
    • N叉树的层序遍历
    • N叉树的前序遍历
    • N叉树的后序遍历
    • N叉树的深度
    • 二叉树的中序遍历
    • 和并两个有序数组
    • 移除元素
    • 删除有序数组中的重复项Ⅱ
    • 多数元素
    • 找到数组的中间位置
    • 搜索插入位置
    • 最长连续序列
    • 三数之和
    • 找到字符串中所有字母异位词
    • 有效的括号
    • 最小栈
    • 求出硬币游戏的玩家
    • Find the odd int
    • Regex validate PIN code
    • Find the next perfect square
  • 折腾

  • 分享

  • 随笔
  • 每日算法
kros
2024-10-18

三数之和

题目:三数之和 给你一个整数数组nums,判断是否存在三元组[nums[i], nums[j], nums[k]]满足i != j、i != k 且 j != k,同时还满足nums[i] + nums[j] + nums[k] == 0。请你返回所有和为0且不重复的三元组。

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

最简单的思路就是多层for循环,当数据量过大时这种情况无法通过leetcode测试,我们可以使用双指针的方式进行遍历筛选,如下:

  • 先对数组进行排序
  • 遍历数组,i从1到length-2,借助前置指针s和后置指针e,s从i-1开始递减,e从i+1开始递增
  • 如果nums[s] + nums[i] + nums[e] == 0,记录该值;如果大于0则s--;如果小于0则e++
  • 当nums[s] + nums[i] + nums[e] == 0时借助辅助数组或对象判断重复
  • 如果s大于0,nums[s] + nums[i] + nums[e]必大于0,则s--
  • 如果e小于0,nums[s] + nums[i] + nums[e]必小于0,则e++
var threeSum = function (nums) {
    nums.sort((a, b) => (a - b))
    let res = [], mid = {}
    for(let i = 1; i < nums.length -1; i++) {
        let s = i - 1, e = i + 1
        // if (mid.includes(nums[i])) continue
        while(s >= 0 && e < nums.length) {
            // s-1等于当前s,跳过避免重复
            if (nums[s] > 0 || nums[s] == nums[s - 1]) {
                s --
                continue
            }
            // e+1等于当前e,跳过避免重复
            if (nums[e] < 0 || nums[e] == nums[e + 1]) {
                e ++
                continue
            }
            let sum = nums[s] + nums[i] + nums[e]
            if (sum == 0) {
                const arr = [nums[s], nums[i], nums[e]]
                if (!mid.hasOwnProperty(arr.toString())) {
                    res.push(arr)
                    mid[arr.toString()] = 1
                }
                s--, e++
            } else if(sum < 0) {
                e++
            } else if(sum > 0) {
                s--
            }
        }
    }
    return res
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

上面的代码虽然能通过测试,实际的效率确非常低,所以要对上面的代码进行优化。

上次更新: 2025/09/05, 8:09:00
最长连续序列
找到字符串中所有字母异位词

← 最长连续序列 找到字符串中所有字母异位词→

最近更新
01
Find the next perfect square
09-05
02
Regex validate PIN code
09-05
03
Find the odd int
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 kros king
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev