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

LeetCode 刷题【15. 三数之和】

15. 三数之和

自己做

解1:三层for循环(超时)

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int len = nums.size();vector<vector<int>> res;for (int i = 0; i < len; i++)for (int j = i + 1; j < len; j++)for (int k = j + 1; k < len; k++)if (i != j && i != k && j != k && (nums[i] + nums[j] + nums[k] == 0)) {int res_len = res.size();if (res_len > 0) {bool unique = true; //标记是否唯一for (int r = 0; r < res_len; r++)                       //检查是否重复if (res[r][0] == nums[i] && res[r][1] == nums[j] && res[r][2] == nums[k] ||          //重复res[r][0] == nums[i] && res[r][1] == nums[k] && res[r][2] == nums[j] ||res[r][0] == nums[j] && res[r][1] == nums[k] && res[r][2] == nums[i] ||res[r][0] == nums[j] && res[r][1] == nums[i] && res[r][2] == nums[k] ||res[r][0] == nums[k] && res[r][1] == nums[i] && res[r][2] == nums[j] ||res[r][0] == nums[k] && res[r][1] == nums[j] && res[r][2] == nums[i])unique = false; //如果有重复则标记为falseif(unique)          //无重复res.push_back(vector<int>({ nums[i] , nums[j] , nums[k] }));}else {                                                        //首个三元组不考虑res.push_back(vector<int>({ nums[i] , nums[j] , nums[k] }));}}return res;}
};

解2:两层for+哈希(超时)

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int len = nums.size();map<int, int> m;vector<vector<int>> res;for (int i = 0; i < len; i++)m.insert(make_pair(nums[i], i));for (int i = 0; i < len; i++)for (int j = i + 1; j < len; j++) {map<int,int>::iterator num3 = m.find(-(nums[i] + nums[j]));if (num3 != m.end()) {                 //找到相匹配的的num3 => num1 + num2 = - num3int k = num3->second;//检查是否存在重复if (i != k && j != k) {int res_len = res.size();if (res_len > 0) {bool unique = true; //标记是否唯一for (int r = 0; r < res_len; r++)                       //检查是否重复if (res[r][0] == nums[i] && res[r][1] == nums[j] && res[r][2] == nums[k] ||          //重复res[r][0] == nums[i] && res[r][1] == nums[k] && res[r][2] == nums[j] ||res[r][0] == nums[j] && res[r][1] == nums[k] && res[r][2] == nums[i] ||res[r][0] == nums[j] && res[r][1] == nums[i] && res[r][2] == nums[k] ||res[r][0] == nums[k] && res[r][1] == nums[i] && res[r][2] == nums[j] ||res[r][0] == nums[k] && res[r][1] == nums[j] && res[r][2] == nums[i])unique = false; //如果有重复则标记为falseif (unique)          //无重复res.push_back(vector<int>({ nums[i] , nums[j] , nums[k] }));}else {                                                        //首个三元组不考虑res.push_back(vector<int>({ nums[i] , nums[j] , nums[k] }));}}}}return res;}
};

 

看题解

 双指针化两层for循环为一层

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int len = nums.size();vector<vector<int>> res;//排序数组sort(nums.begin(), nums.end());for (int first = 0; first < len; first++) {int third = len - 1;                                    //右指针【指向最大值】while (first < len && first > 0 && nums[first] == nums[first - 1]) {            //上一回相等的情况下,为防止撞车,所以first不能等于原来的值first++;}for (int second = first + 1; second < third; second++) {while (second < third && second > first + 1 && nums[second] == nums[second - 1]) {            //上一回相等的情况下,为防止撞车,所以second不能等于原来的值second++;}while(second < third && !(nums[first] + nums[second] + nums[third] == 0)){if (second < third && nums[first] + nums[second] + nums[third] > 0) {                      //右指针third大了third--;}if (second < third && nums[first] + nums[second] + nums[third] < 0) {                      //左指针second小了second++;}}//找到nums[first] + nums[second] + nums[third] = 0,将结果存放if (second < third && nums[first] + nums[second] + nums[third] == 0)res.push_back(vector<int>({ nums[first], nums[second], nums[third] }));}}return res;}
};

http://www.dtcms.com/a/299102.html

相关文章:

  • Ubuntu 18.04安装Fast-Lio2教程
  • 开发者说|RoboTransfer:几何一致视频世界模型,突破机器人操作泛化边界
  • Vue当中背景图无法占满屏幕的解决方法
  • JavaScript里的reduce
  • JavaScript 对象、字符串的统计和排序高频面试题
  • Spring Boot 3 如何整合 MinIO 实现分布式文件存储?
  • 【20】C# 窗体应用WinForm ——下拉列表框ComboBox属性、方法、实例应用
  • 掌握JavaScript函数封装与作用域
  • 【资讯】2025年软件行业发展趋势:AI驱动变革,云原生与安全成核心
  • C++/CLI与标准C++的语法差异(一)
  • 《jQuery Mobile 页面》
  • 统计学07:概率论基础
  • ICMPv6报文类型详解表
  • opencv学习(图像金字塔)
  • 算法第三十九天:动态规划part07(第九章)
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现沙滩小人检测识别(C#代码UI界面版)
  • Kafka MQ 消费者应用场景
  • 【C++】stack和queue的模拟实现
  • 【C++】定义常量
  • SpringBoot连接Sftp服务器实现文件上传/下载(亲测可用)
  • Java中List集合对象去重及按属性去重
  • 【Linux系统】理解硬件 | 引入文件系统
  • MySQL数据库本地迁移到云端完整教程
  • 部署上线你的项目
  • 【Git】实用Git操作指南:从入门到高效协作
  • 小米携手云轴科技ZStack获信通院可信云用户典型实践奖
  • 大语言模型 LLM 通过 Excel 知识库 增强日志分析,根因分析能力的技术方案(2):LangChain + LlamaIndex 实现
  • Nanopct6SDK问题汇总与解决方案
  • 【架构】Docker简单认知构建
  • 【工程化】浅谈前端构建工具