news 2026/4/23 14:19:41

双指针--双数之和

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
双指针--双数之和

题目解析

给定一个整数数组nums,要求找出所有不重复的三元组[nums[i], nums[j], nums[k]],满足:

  • 索引互不相同:i != ji != kj != k
  • 三数之和为 0:nums[i] + nums[j] + nums[k] = 0
  • 结果中不能包含重复的三元组

核心思路

这道题的难点在于去重时间复杂度优化,直接暴力枚举的时间复杂度是 \(O(n^3)\),会超时。我们可以用排序 + 双指针的方法,将时间复杂度优化到 \(O(n^2)\)。

算法步骤

  1. 排序预处理先对数组进行排序,这样可以利用有序性进行双指针的移动和去重操作。
  2. 固定第一个数遍历数组,将当前元素作为三元组的第一个数nums[i]
    • 如果当前数和前一个数相同,直接跳过(去重)。
    • 如果当前数大于 0,因为数组是有序的,后面的数也都是正数,三数之和不可能为 0,直接终止循环。
  3. 双指针寻找另外两个数用左指针left = i + 1和右指针right = nums.size() - 1来寻找另外两个数:
    • 计算三数之和sum = nums[i] + nums[left] + nums[right]
    • 如果sum < 0:说明需要更大的数,左指针右移
    • 如果sum > 0:说明需要更小的数,右指针左移
    • 如果sum = 0:记录该三元组,并移动左右指针跳过重复值

完整代码

cpp

class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res; int n = nums.size(); if (n < 3) return res; // 数组长度不足3,直接返回空 sort(nums.begin(), nums.end()); for (int i = 0; i < n - 2; ++i) { // 去重:跳过与前一个元素相同的情况 if (i > 0 && nums[i] == nums[i-1]) continue; // 剪枝:如果当前数已经大于0,后面不可能组成和为0的三元组 if (nums[i] > 0) break; int left = i + 1; int right = n - 1; while (left < right) { int sum = nums[i] + nums[left] + nums[right]; if (sum < 0) { left++; } else if (sum > 0) { right--; } else { // 找到一个符合条件的三元组 res.push_back({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; } };

关键优化点

  • 排序去重:排序后,相同的元素会相邻,我们可以很方便地跳过重复值。
  • 剪枝操作:当固定的第一个数大于 0 时,直接终止循环,因为后面的数都是正数,不可能组成和为 0 的三元组。
  • 双指针移动:找到符合条件的三元组后,需要同时移动左右指针,并跳过重复值,避免生成重复的三元组。

复杂度分析

  • 时间复杂度:\(O(n^2)\),其中排序的时间复杂度是 \(O(n \log n)\),双指针遍历的时间复杂度是 \(O(n^2)\)。
  • 空间复杂度:\(O(\log n)\)(排序的栈空间)或 \(O(n)\)(如果使用了额外的数组存储结果)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:32:18

基于STM32+ST7735的智能手环原型开发:新手教程

以下是对您原始博文的 深度润色与结构优化版本 。我以一位资深嵌入式系统工程师兼技术博主的身份&#xff0c;将原文重构为一篇更具 专业纵深、教学逻辑清晰、实战导向明确、语言自然流畅 的技术分享文章。全文彻底摒弃AI腔调和模板化表达&#xff0c;强化真实开发语境下的…

作者头像 李华
网站建设 2026/4/23 12:30:52

超越CRUD:构建高性能、可测试的FastAPI应用架构深度解析

好的&#xff0c;收到您的需求。结合随机种子 1769472000072 所激发的一点“非典型”灵感&#xff0c;我将为您撰写一篇聚焦于 FastAPI 高级依赖注入、架构模式及性能深度考量 的技术文章&#xff0c;避免简单的“Hello World”式教程&#xff0c;力求为资深开发者提供架构层面…

作者头像 李华
网站建设 2026/4/23 13:35:45

CosyVoice-300M Lite新闻播报应用:自动化生成部署案例

CosyVoice-300M Lite新闻播报应用&#xff1a;自动化生成部署案例 1. 为什么新闻团队开始用这个“小个子”语音引擎&#xff1f; 你有没有见过这样的场景&#xff1a;凌晨三点&#xff0c;编辑部还在赶早间新闻稿&#xff1b;短视频团队刚收到突发快讯&#xff0c;却卡在配音…

作者头像 李华
网站建设 2026/4/19 14:25:19

隐私无忧!Qwen2.5-1.5B本地对话助手保姆级部署指南

隐私无忧&#xff01;Qwen2.5-1.5B本地对话助手保姆级部署指南 你是否曾担心&#xff1a;在网页上向AI提问时&#xff0c;输入的会议纪要、产品需求、代码片段甚至私人聊天记录&#xff0c;正悄悄上传到某个未知服务器&#xff1f;是否厌倦了反复注册账号、等待排队、被限速、…

作者头像 李华
网站建设 2026/4/23 14:01:37

Z-Image-Turbo生成人物不失真,秘诀在这里

Z-Image-Turbo生成人物不失真&#xff0c;秘诀在这里 很多人用Z-Image-Turbo生成人物图时遇到过这些问题&#xff1a;脸歪、五官错位、手指数量不对、头发糊成一团、肢体比例失调……明明提示词写得清清楚楚&#xff0c;结果却像被“随机重绘”过。其实不是模型不行&#xff0…

作者头像 李华