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

双指针--双数之和

题目解析

给定一个整数数组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)\)(如果使用了额外的数组存储结果)。
http://www.jsqmd.com/news/306993/

相关文章:

  • 2026年质量好的大气除氧器/真空除氧器行业内知名厂家推荐
  • 解密 Navicat 密码神器:NavicatPassword 的技术实现与架构解析
  • 2026年靠谱的输送带检测/输送带检测设备用户信赖榜
  • 2026年河南专业的账号交易平台企业排名,口碑不错的有哪些?
  • 靠谱的账号交易平台多少钱,游盛186费用合理吗
  • 2026年诚信的账号交易平台推荐,账号交易平台费用怎么收
  • 快客约车可以信任吗 出行投资靠谱品牌排名
  • 说说杭州数峦云科技的口碑在业内排名,靠谱厂家推荐有吗?
  • 2026年靠谱的C型高速冲床/精密高速冲床厂家质量参考评选
  • 2026年专业的数字孪生工厂系统推荐,头部厂商哪家强?
  • 2026年知名的激光喷码机/浙江热发泡喷码机全方位厂家推荐参考
  • 2026年靠谱的屋面变形缝/变形缝厂家最新推荐
  • 2026年知名的汽配激光打标机/浙江激光打标机厂家推荐与采购指南
  • 2026年评价高的程控磨床/自动磨床热门厂家推荐汇总
  • 2026年比较好的程控平面磨床/精密平面磨床行业内口碑厂家推荐
  • 2026年热门的菱形座带座外球面轴承/法兰座带座外球面轴承人气实力厂商推荐
  • Oracle 19c入门学习教程,从入门到精通,Oracle系统调优 —— 内存结构与参数优化详解(15)
  • 2026年质量好的印刷设备外球面轴承/输送机外球面轴承厂家推荐与选择指南
  • 2026年靠谱的洛阳无人机执照培训/洛阳无人机行业培训人气机构TOP榜
  • 如何为高端制造企业选择GEO服务商?2026年GEO优化公司推荐与垂直领域评测
  • 如何为垂直行业选GEO服务商?2026年GEO优化公司全面评测与推荐,直击权威构建与流量波动痛点
  • 互联网大厂Java求职面试实战:涵盖Spring Boot、微服务与AI技术全解析
  • 2026杭州免费咨询律所推荐+杭州律师事务所推荐+杭州本地律所推荐:杭州企业法律顾问哪家好
  • 消费品品牌如何布局AI搜索?2026年GEO公司推荐与评价,解决场景化推荐与增长闭环痛点
  • 2026年GEO公司推荐:技术架构与实战成效横向排名,涵盖多行业场景与合规需求
  • 实用指南:学习笔记二十四:支持向量机-对偶问题
  • 完整教程:VBA之Word应用第四章第五节:段落Paragraph对象的属性(一)
  • Laravel Boost v2.0 发布 正式支持 Skills
  • 基于STM32+ST7735的智能手环原型开发:新手教程
  • 手把手教你用Ollama运行Phi-3-mini智能对话