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

相关文章:

  • 新手向:Git下载全攻略
  • 统计与大数据分析与数学金融课程解析
  • C++查询mysql数据
  • RabbitMQ--Springboot解决消息丢失
  • JavaWeb01——基础标签及样式(黑马视频笔记)
  • Android WorkManager 详解:高效管理后台任务
  • InstructBLIP:通过指令微调迈向通用视觉-语言模型
  • Android Data Binding 深度解析与实践指南
  • 像素、视野、光源,都有哪些因素影响测量精度?
  • 数据中心-时序数据库InfluxDB
  • 【影刀RPA_初级课程_我的第一个机器人】
  • jxORM--查询数据
  • 前端模块化开发实战指南
  • 【机器学习深度学习】模型私有化部署与微调训练:赋能特定问题处理能力
  • Oracle 11g RAC数据库实例重启的两种方式
  • JavaScript:现代Web开发的核心动力
  • 基于深度学习的胸部 X 光图像肺炎分类系统(六)
  • 技术赋能与营销创新:开源链动2+1模式AI智能名片S2B2C商城小程序的流量转化路径研究
  • SpringBoot连接Sftp服务器实现文件上传/下载(亲测可用)
  • Linux选择题
  • 《从零开始学 JSSIP:JavaScript 实时通信开发实战》
  • Jmeter的元件使用介绍:(五)定时器详解
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现轮船检测识别(C#代码UI界面版)
  • PostGIS面试题及详细答案120道之 (011-020 )
  • 零基础学习性能测试第三章:jmeter构建性能业务场景
  • 论文阅读-RaftStereo
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-27,(知识点:信号完整性,信号反射,串扰,时延,抖动,衰减)
  • Qt 延时处理方法介绍
  • day 36打卡
  • 去中心化时代的通信革命:briefing与cpolar技术融合带来的安全范式革新