当前位置: 首页 > news >正文

【算法】15. 三数之和

一、题目是啥?一句话说清

给你一个整数数组,找出所有不重复的三元组(三个数),使得这三个数的和等于零。

示例:

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

二、解题核心

先对数组排序,然后固定一个数,用双指针在剩余数组中寻找两个数,使得三数之和为零。同时,通过跳过重复值来避免重复三元组。

这就像你请朋友吃饭,要点三个菜,总价正好是100元。你先固定一个主菜的价格,然后用两个指针在菜单上滑动,找两个配菜的价格,使得三个菜的总价是100元。如果遇到重复的菜价,就跳过以免点重样的菜。

三、关键在哪里?(3个核心点)

想理解并解决这道题,必须抓住以下三个关键点:

1. 排序数组

  • 是什么:首先将数组从小到大排序。
  • 为什么重要:排序后,数组变得有序,我们可以使用双指针来高效地寻找两个数的和,同时容易跳过重复值,避免重复三元组。

2. 双指针技巧

  • 是什么:对于每个固定的数 nums[i],使用左指针(从 i+1 开始)和右指针(从数组末尾开始)来寻找两个数,使得它们的和等于 -nums[i]
  • 为什么重要:双指针可以将两数之和的时间复杂度从 O(n²) 降低到 O(n),从而将整体算法优化到 O(n²)。

3. 跳过重复值

  • 是什么:在固定数、移动左指针和右指针时,如果遇到重复值,就跳过它们。
  • 为什么重要:这是避免重复三元组的关键。如果不跳过重复值,可能会产生多个相同的三元组。

四、看图理解流程(通俗理解版本)

让我们用 nums = [-1, 0, 1, 2, -1, -4] 的例子来可视化过程:

  1. 排序数组:先排序,得到 [-4, -1, -1, 0, 1, 2]。

  2. 固定第一个数(-4)

    • 我们需要找两个数,它们的和等于 4(因为 -(-4) = 4)。
    • 左指针在 -1,右指针在 2。
    • 计算和:-1 + 2 = 1 < 4,左指针右移(到下一个 -1)。
    • 计算和:-1 + 2 = 1 < 4,左指针右移(到 0)。
    • 计算和:0 + 2 = 2 < 4,左指针右移(到 1)。
    • 计算和:1 + 2 = 3 < 4,左指针右移,但左指针超过右指针,停止。没有找到三元组。
  3. 固定第二个数(-1)

    • 注意:跳过重复值!第一个固定数是 -4,现在固定数是 -1,但 since 我们已经处理过 -1,所以这里固定第一个 -1(索引1)。
    • 我们需要找两个数,它们的和等于 1(因为 -(-1) = 1)。
    • 左指针在下一个 -1(索引2),右指针在 2。
    • 计算和:-1 + 2 = 1 == 1,找到三元组 [-1, -1, 2]。
    • 左指针右移(到 0),右指针左移(到 1)。
    • 计算和:0 + 1 = 1 == 1,找到三元组 [-1, 0, 1]。
    • 左指针右移,右指针左移,停止。
  4. 固定第三个数(-1)

    • 但这是第二个 -1,与上一个固定数相同,所以跳过(避免重复)。
  5. 固定第四个数(0)

    • 我们需要找两个数,它们的和等于 0。
    • 左指针在 1,右指针在 2。
    • 计算和:1 + 2 = 3 > 0,右指针左移(到 1)。
    • 但左指针和右指针相遇,停止。没有新三元组。
  6. 结束:最终得到两个三元组 [-1, -1, 2] 和 [-1, 0, 1]。

五、C++ 代码实现(附详细注释)

#include <iostream>
#include <vector>
#include <algorithm>
using
http://www.dtcms.com/a/357806.html

相关文章:

  • 学习做动画7.跳跃
  • UCIE Specification详解(十)
  • 快速深入理解zookeeper特性及核心基本原理
  • 【拍摄学习记录】06-构图、取景
  • Docker03-知识点整理
  • TypeScript:map和set函数
  • 2025 DDC系统选型白皮书:构建高效低碳智慧楼宇的核心指南
  • 【python开发123】三维地球应用开发方案
  • python 解码 视频解码
  • 打工人日报#20250829
  • 人工智能-python-深度学习-批量标准化与模型保存加载详解
  • OpenTenBase 技术解读与实战体验:从架构到行业落地
  • 2024年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • c++标准模板库
  • 轨道交通场景下设备状态监测与智能润滑预测性维护探索
  • 动态环境下的人员感知具身导航!HA-VLN:具备动态多人互动的视觉语言导航基准与排行榜
  • Free Subtitles-免费AI在线字幕生成工具,支持111种语言
  • 【ChatMemory聊天记忆】
  • STM32F4系列单片机如何修改主频
  • 从世界人形机器人大会看人形机器人如何实现复杂人类动作的精准复现?
  • 【论文简读】MuGS
  • 【拍摄学习记录】05-对焦、虚化、景深
  • 2025年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • Golang 面试题「中级」
  • 四旋翼飞行器动力学建模与简单PID控制
  • 锂电池充电芯片 XSP30支持PD/QC等多种快充协议支持最大充电电流2A
  • 嵌入式Linux驱动开发:i.MX6ULL平台设备驱动
  • 第22章笔记|把“可传参脚本”打磨成“高级好用的工具”
  • 博客系统测试实战:功能和性能的全面解析
  • selenium自动下载更新浏览器对应的webdriver