【 每天学习一点算法 2026/01/30】三数之和

每天学习一点算法 2026/01/30

题目:三数之和

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

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

这道题可以变成再数字中找两数和为某一个数,我们遍历数组将然后在其余项中找与这个项和为 0 的两项即可,为了方便后续的选择操作,我们可以对数组进行排序,再利用双指针找到目标值(注意事项我就写在代码备注里面了)。

typescript 复制代码
function threeSum(nums: number[]): number[][] {
  nums.sort((a, b) => a - b) // 对数组进行排序
  const res = []
  for (let i = 0; i < nums.length - 2; i++) {
    if (i > 0 && nums[i] === nums[i - 1]) continue // 跳过重复的项
    if (nums[i] > 0) break; // 因为已经进行了排序,如果当前值已经大于 0 就不可能和为 0 了
    let left = i + 1 // 左指针
    let right = nums.length - 1 // 右指针
    const traget = -nums[i] // 目标值
    while (left < right) {
      const sum = nums[left] + nums[right]
      // 两数和与目标值不相等根据情况移动指针
      if (sum > traget) {
        right--
      } else if (sum < traget) {
        left++
      } else {
        // 两数和与目标值相等
        res.push([nums[i], nums[left], nums[right]]) // 添加三元组至结果数组中
        // 跳过重复项
        while (left < right && nums[left] === nums[left + 1]) left++ 
        while (left < right && nums[right] === nums[right - 1]) right--
        // 移动指针
        left++
        right--
      }
    }
  }
  return res
};

题目来源:力扣(LeetCode)

相关推荐
先吃饱再说3 小时前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰6 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术7 小时前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六11 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术11 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize12 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
CSharp精选营1 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法