news 2026/10/30 13:51:15

双指针--双数之和

作者头像

张小明

前端开发工程师

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

题目解析

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

  • 索引互不相同:i != j、i != k、j != 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/10/21 11:35:57

Z-Image-Turbo支持中文提示词,描述更自然

Z-Image-Turbo支持中文提示词&#xff0c;描述更自然 Z-Image-Turbo不是又一个“能跑就行”的图像生成模型&#xff0c;而是真正把中文表达逻辑吃透的AI绘画工具。它不强迫你翻译成英文、不依赖生硬的关键词堆砌、不让你反复试错调整语法结构——你用日常说话的方式写提示词&a…

作者头像 李华
网站建设 2026/10/22 7:27:34

GLM-4V-9B实战:电商商品图智能描述生成全攻略

GLM-4V-9B实战&#xff1a;电商商品图智能描述生成全攻略 1. 为什么电商运营急需这张“嘴” 你有没有遇到过这些场景&#xff1a; 每天上架30款新品&#xff0c;每张主图都要配5条不同风格的文案&#xff1a;卖点版、情感版、短视频口播版、小红书种草版……写到凌晨两点&am…

作者头像 李华
网站建设 2026/10/29 10:01:04

Keil5下载及安装教程:STM32开发环境手把手搭建

以下是对您提供的博文内容进行 深度润色与结构化重构后的专业级技术文章 。全文严格遵循您的所有要求&#xff1a; ✅ 彻底去除AI痕迹&#xff0c;语言自然、有温度、有经验沉淀&#xff1b; ✅ 摒弃模板化标题&#xff08;如“引言”“总结”&#xff09;&#xff0c;代之…

作者头像 李华
网站建设 2026/10/22 7:28:04

Qwen3-VL-4B ProGPU优化部署:显存占用降低35%,推理速度提升2.1倍

Qwen3-VL-4B Pro GPU优化部署&#xff1a;显存占用降低35%&#xff0c;推理速度提升2.1倍 1. 为什么需要一个真正能跑得动的4B视觉语言模型&#xff1f; 你有没有试过下载一个标榜“多模态”的大模型&#xff0c;结果刚加载就报错OOM&#xff08;显存不足&#xff09;&#x…

作者头像 李华
网站建设 2026/10/29 15:30:32

YOLOv13镜像实测:3步完成模型预测演示

YOLOv13镜像实测&#xff1a;3步完成模型预测演示 在目标检测工程实践中&#xff0c;最令人沮丧的时刻往往不是模型不收敛&#xff0c;而是——环境配了两小时&#xff0c;连第一张图都没跑出来。你下载完镜像、启动容器、cd进目录&#xff0c;却卡在ModuleNotFoundError: No …

作者头像 李华
网站建设 2026/10/29 3:46:09

RexUniNLU中文-base参数详解:DeBERTa架构适配与显存优化实践

RexUniNLU中文-base参数详解&#xff1a;DeBERTa架构适配与显存优化实践 1. 为什么需要关注RexUniNLU的参数配置 你有没有遇到过这样的情况&#xff1a;模型下载下来了&#xff0c;代码也跑通了&#xff0c;但一输入长文本就报OOM&#xff08;显存不足&#xff09;&#xff1…

作者头像 李华