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

双指针—三数之和

1、先看题目要求
给一个数组 nums,找出所有不重复的三元组
[a, b, c] 满足:

  1. a + b + c = 0
  2. 三个元素下标不同
  3. 答案不能重复(比如 [-1,-1,2] 不能出现多次)

2、核心解法:排序 + 双指针(最优解)
为什么这么做?

  1. 排序:方便去重 + 方便双指针移动
  2. 固定一个数(外层用for循环固定这个数,因为要遍历数组),然后用双指针(内层用while循环移动双指针,因为循环的条件是left<right)找另外两个数,让三数之和 = 0
  3. 自动去重:排序后相同数字挨在一起,跳过重复(在找到使得sum=0的三个数后,需要同时移动两个指针,这里需要做去重处理,防止指针指向的数和原来的数相等,因为第一个数是固定的,如果第二个数和原来的第三个数一样,那么第三个数也还是和原来一样,因此需要对移动的两个指针做去重处理)即可

完整代码实现如下:

#include
#include
#include
using namespace std;

vector<vector> threeSum(vector& nums) {
vector<vector> res; // 存放最终答案
sort(nums.begin(), nums.end()); // 1. 先排序!关键!
int n = nums.size();

// 2. 固定第一个数 nums[i]
for (int i = 0; i < n; i++) {// 去重:如果当前数和前一个一样,直接跳过(避免重复三元组)if (i > 0 && nums[i] == nums[i - 1]) continue;int left = i + 1;   // 左指针:i 的下一个int right = n - 1;  // 右指针:数组末尾// 3. 双指针遍历找另外两个数while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum == 0) {// 找到一组解res.push_back({nums[i], nums[left], nums[right]});// 去重:跳过重复的 leftwhile (left < right && nums[left] == nums[left + 1]) left++;// 去重:跳过重复的 rightwhile (left < right && nums[right] == nums[right - 1]) right--;// 移动指针继续找left++;right--;}else if (sum < 0) {// 和太小 → 左指针右移(变大)left++;}else {// 和太大 → 右指针左移(变小)right--;}}
}
return res;

}

// 测试
int main() {
vector nums = {-1, 0, 1, 2, -1, -4};
auto ans = threeSum(nums);

cout << "所有三数之和为0的不重复三元组:" << endl;
for (auto& v : ans) {cout << v[0] << " " << v[1] << " " << v[2] << endl;
}
return 0;

}

3、双指针规则
left 从 i+1 开始
right 从末尾开始
计算三数之和 sum

三种情况:

sum = 0
✅ 找到答案!加入结果
✅ 跳过重复的 left 和 right
✅ left++,right--

sum < 0
➡ 和太小了
➡ 左指针右移(让数字变大)

sum > 0
⬅ 和太大了
⬅ 右指针左移(让数字变小)

4、去重(最关键!)
题目要求答案不重复
所以:
如果 nums[i] 和前一个数一样 → 跳过
如果 nums[left] 重复 → 跳过
如果 nums[right] 重复 → 跳过

http://www.jsqmd.com/news/529707/

相关文章:

  • 20254221 实验一《Python程序设计》实验报告
  • CosyVoice零样本克隆实测:仅需5秒参考音频,完美复刻你的声音特色
  • 小程序制作一般分为哪几种方式?
  • Anything V5图像生成服务完整使用教程:环境配置到参数设置
  • OPC UA over HTTPS + Modbus TCP双模冗余网关开发实录:1套代码适配西门子/罗克韦尔/三菱三大品牌PLC,附可商用License-Free框架
  • [SDCTF 2022]Apollo 1337
  • 品牌在豆包做AI广告推广,联系哪家外包公司更靠谱? - 品牌2026
  • STM32实战:5分钟搞定RS485串口通信(含printf调试技巧)
  • QQ音乐加密文件终极解密指南:使用qmcdump快速解锁你的音乐收藏
  • 考研数学一、二、三历年真题及答案解析PDF电子版(1987-2026年)
  • 从真题到实战:中南大学计算机考研机试核心算法精讲与备考策略
  • 5个维度深度解析Pear Admin Flask:构建企业级后台系统的最佳实践
  • 开源媒体播放器Tsukimi:打造极致观影体验的全方位指南
  • 20254213牟文毅-实验一报告
  • OpenClaw跨平台控制:Qwen3.5-9B同步管理多台设备的验证方案
  • 基于滑模观测器的永磁同步电机控制算法研究:仿真设计与对照分析
  • 如何使用Java实现课程资料下载功能
  • PCB Layout新手必看:从SMT贴片到EMC设计的5个实战避坑技巧
  • 如何通过UEFI设置主动触发GPU Power Brake?保姆级教程来了
  • 20254114刘小萌实验一
  • Saleng GSM Shield开发指南:SIM800L模块Arduino库详解
  • Scarab:空洞骑士模组管理的终极自动化解决方案
  • FPGA接OV5640摄像头,图像撕裂和错位怎么破?我的调试踩坑实录
  • 给Linux内核新手:为什么你总在驱动代码里看到__iomem?一个Sparse静态检查的故事
  • 终极指南:如何用GB/T 7714-2015参考文献样式库彻底解决学术写作格式问题
  • FDTD(三)边界条件实战指南:PML参数优化与Metal边界高效仿真
  • 自动驾驶背后的AI Native架构:实时流处理与认知网络如何实现?
  • 5分钟掌握d2s-editor:暗黑破坏神2存档修改的终极解决方案
  • FFmpeg环境配置避坑指南:为什么你的‘ffmpeg -version‘命令总是报错?
  • 5分钟搞定!用ChatGPT+Mermaid快速生成系统架构图(附实战案例)