当前位置: 首页 > 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.xdnf.cn/news/1193275.html

相关文章:

  • 如何关闭Windows自动更新?【图文详解】win10/win11关闭自动更新
  • CentOS 7 安装 MySQL 8.4.6(二进制包)指南
  • Linux——线程同步
  • CT、IT、ICT 和 DICT区别
  • 【架构】Docker简单认知构建
  • 【科研绘图系列】R语言绘制误差连线散点图
  • 秋招Day19 - 分布式 - 分布式事务
  • 生产环境使用云服务器(centOS)部署和使用MongoDB
  • Java操作Excel文档
  • opencv学习(图像金字塔)
  • 背包问题及 LIS 优化
  • 告别配置混乱!Spring Boot 中 Properties 与 YAML 的深度解析与最佳实践
  • C#编程基础:运算符与结构详解
  • 【Android】相对布局应用-登录界面
  • 2025.7.26字节掀桌子了,把coze开源了!!!
  • window下MySQL安装(三)卸载mysql
  • Fast_Lio 修改激光雷达话题
  • VLAN的划分(基于华为eNSP)
  • MySQL 8.0 OCP 1Z0-908 题目解析(37)
  • 尝试几道算法题,提升python编程思维
  • Linux内核设计与实现 - 课程大纲
  • LeetCode 1074:元素和为目标值的子矩阵数量
  • 使用Spring Boot创建Web项目
  • 学习嵌入式的第三十二天-数据结构-(2025.7.24)IO多路复用
  • 开发者说|RoboTransfer:几何一致视频世界模型,突破机器人操作泛化边界
  • 1. Qt多线程开发
  • SpringMVC——建立连接
  • OpenFeign-远程调用
  • 计算机中的数据表示
  • Windows Server系统安装JDK,一直卡在“应用程序正在为首次使用作准备,请稍候”