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

09.三数之和

在这里插入图片描述

✅ 解法一:排序 + 双指针(最优推荐解)

✅ 思路简要:

  1. 排序数组。
  2. 枚举第一个数 nums[i]
  3. 使用 双指针(从 i+1 到末尾)找其余两个数,使得三数之和为 0
  4. 跳过重复元素,避免重复解。

✅ C++ 代码:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(), nums.end());int n = nums.size();if (n < 3) return res;for (int i = 0; i < n; ++i) {if (nums[i] > 0) break;if (i > 0 && nums[i] == nums[i - 1]) continue;int l = i + 1, r = n - 1;while (l < r) {int sum = nums[i] + nums[l] + nums[r];if (sum == 0) {res.push_back({nums[i], nums[l], nums[r]});while (l < r && nums[l] == nums[l + 1]) ++l;while (l < r && nums[r] == nums[r - 1]) --r;++l;--r;} else if (sum < 0) {++l;} else {--r;}}}return res;}
};

✅ 时间复杂度:

  • 排序:O(n log n)
  • 外层遍历 + 双指针:O(n²)
  • 总体:O(n²),是最优解。

✅ 解法二:哈希表 + 去重(思维训练用)

✅ 思路简要:

  1. 枚举第一个数 nums[i]
  2. 对于剩下的元素,用 unordered_set 找两数之和为 -nums[i]
  3. set 去重三元组(也可以手动判断是否存在)。

✅ C++ 代码:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {set<vector<int>> resSet;int n = nums.size();sort(nums.begin(), nums.end());for (int i = 0; i < n - 2; ++i) {int target = -nums[i];unordered_set<int> seen;for (int j = i + 1; j < n; ++j) {int complement = target - nums[j];if (seen.count(complement)) {vector<int> triplet = {nums[i], complement, nums[j]};sort(triplet.begin(), triplet.end()); // 排序去重resSet.insert(triplet);}seen.insert(nums[j]);}}return vector<vector<int>>(resSet.begin(), resSet.end());}
};

✅ 特点:

  • 利用哈希表 seen 实现 O(1) 查找
  • 去重使用 set,也可手动实现去重逻辑。
  • 时间复杂度依旧为 O(n²),但常数略大。

✅ 总结对比

解法方法是否排序是否推荐时间复杂度空间复杂度重复处理
解法一排序 + 双指针✅推荐O(n²)O(1)精准跳过重复
解法二枚举 + 哈希表补充理解用O(n²)O(n)set自动去重

文章转载自:

http://07r1XQ8y.fnhxp.cn
http://XX7F0O27.fnhxp.cn
http://eYP3VrQf.fnhxp.cn
http://zuU2Jn0m.fnhxp.cn
http://eYxLtHCp.fnhxp.cn
http://uFr6Oy80.fnhxp.cn
http://UdkQSOAr.fnhxp.cn
http://bidVtJ7p.fnhxp.cn
http://XuEGOCyf.fnhxp.cn
http://kiKdktsK.fnhxp.cn
http://AsVrX6BY.fnhxp.cn
http://hiftQKcn.fnhxp.cn
http://k8iT4rro.fnhxp.cn
http://RpyBYp90.fnhxp.cn
http://CGI50UPz.fnhxp.cn
http://meChn3v5.fnhxp.cn
http://kakV0UQ6.fnhxp.cn
http://fl10pooI.fnhxp.cn
http://hY4CO0NS.fnhxp.cn
http://UlsbUdI6.fnhxp.cn
http://Le9EkVMo.fnhxp.cn
http://ubxpTVUE.fnhxp.cn
http://ZrdOOY48.fnhxp.cn
http://C327UAEz.fnhxp.cn
http://pgK0gK1V.fnhxp.cn
http://jgt6r7uZ.fnhxp.cn
http://OPFUXiO2.fnhxp.cn
http://sHCip2Gs.fnhxp.cn
http://5QCDe2TB.fnhxp.cn
http://GekcPVTW.fnhxp.cn
http://www.dtcms.com/a/235840.html

相关文章:

  • 低内聚高耦合的衡量指标
  • Linux top 命令 的使用总结
  • Python Day43 学习(日志Day10-11复习)
  • SQLServer中的存储过程与事务
  • 【普及+/提高】洛谷P2114 ——[NOI2014] 起床困难综合症
  • Linux操作系统之进程(五):初识地址空间
  • JAVA元编程
  • SCSAI工业智能操作系统=PLM对象模型 × 大模型认知引擎 × 工作流调度层
  • 分布式锁-Redisson实现
  • Linux编程:1、文件编程
  • yolov8自训练模型作为预训练权重【增加新类别】注意事项
  • 思维链的 内部机制和简单理解
  • Q: dify前端使用哪些开发框架?
  • RK3588 火焰烟雾检测
  • 2025.6.5学习日记 Nginx主目录文件 .conf介绍、热部署 定时日志切割
  • MySQL基础(二)SQL语言、客户端工具
  • python中的经典视觉模块:OpenCV(cv2)全面解析
  • 数学复习笔记 28
  • 代理服务器-LVS的3种模式与调度算法
  • c++ set与multiset的介绍
  • 【计算机网络】非阻塞IO——poll实现多路转接
  • Go垃圾回收参数调优:实现低延迟服务的实战指南
  • usb工业广焦摄像头怎么调焦
  • keil编译工程,结合map文件和bin文件,实测C语言中不同类型的变量存储在不同的内存区域
  • 【Zephyr 系列 11】使用 NVS 实现 BLE 参数持久化:掉电不丢配置,开机自动加载
  • 从零开始基于Ubuntu18搭建Gazebo地图仿真环境
  • Ubuntu 系统.sh脚本一键部署内网Java服务(组件使用docker镜像,宕机自启动)
  • D3.js与vue3力导向图开发全流程
  • N8N概述
  • 【Linux】(1)—进程概念-⑤进程调度