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

【算法】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.xdnf.cn/news/19030.html

相关文章:

  • 阻塞,非阻塞,同步,异步的理解
  • Linux -- 进程间通信【命名管道】
  • 【golang长途旅行第34站】网络编程
  • GPT-5原理
  • mybatis.xml直接读取配置文件(application.yml)中的数据
  • 图扑 HT 农林牧数据可视化监控平台
  • 计算机视觉----opencv(图像轮毂绘制(大小选择,排序,外接图形绘制),轮廓的近似,模板的匹配)
  • 10迁移TiDB数据库数据到GaussDB
  • 前端vue3入门学习
  • OSS Nginx 反代提示 SignatureDoesNotMatch
  • 【面试系列】谈谈你对数据库ACID的理解
  • 2023年12月GESP5级C++真题解析,包括选择判断和编程
  • 【MFC教程】C++基础:01 小黑框跑起来
  • 嵌入式学习 day61 DHT11、I2C
  • 数据分析编程第六步:大数据运算
  • MySQL-索引(下)
  • 【C语言初阶】指针_野指针,指针运算
  • 大白话说 AI 编程 Trae,小白进!
  • 【计算机网络】前端基础知识Cookie、localStorage、sessionStorage 以及 Token
  • 【上位机数据转换】数据结构原理及大小端
  • 0基础学智能体/工作流 从入门到精通(超详细课程)
  • Redis面试题--介绍下Redis几种集群模式
  • 序列容器(vector,deque,list)
  • 旧衣物回收小程序功能模块设计分析
  • 华为无线AC主备配置案例
  • CMake构建学习笔记22-libxml2库的构建
  • 不止于价格,DigitalOcean、AWS和Linode该选谁?
  • Vue3+TS+Element-Plus+el-tree创建树节点
  • 【2025 完美解决】Failed connect to github.com:443; Connection timed out
  • Charles打开后,Pc电脑端浏览器显示Not implemented或没有网络