【数组】【双指针】三数之和

打算冲一把算法类比赛,之前一直对算法提不起兴趣,也有我自己对它的抵触,本身算法也比较菜。
但现在打算勤勤恳恳刷题,踏踏实实总结,冲!

数组——双指针

三数之和

在这里插入图片描述
该题力扣网址

错误做法

三重循环框架,最浅显的思路,复杂度是N^3,没有任何优化。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int i,j,k;vector<vector<int>> ans;sort(nums.begin(),nums.end());for(i=0;i<nums.size();i++)for(j=i+1;j<nums.size();j++)for(k=j+1;k<nums.size();k++){if(nums[i]+nums[j]+nums[k]==0){ans.push_back({nums[i], nums[j], nums[k]});}}sort(ans.begin(),ans.end());ans.erase(unique(ans.begin(),ans.end()), ans.end());return ans;}
};

结果就是超时!

也是我第一次刷力扣吧,确实能够提升思路

在这里插入图片描述
琢磨了点,但是因为太菜,好几个月没碰算法,没有什么有效的思路,一直脱离不开三层循环框架,于是看了题解,再次感叹题解做法秒!

再次提交做法

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int i,j,k;vector<vector<int>> ans;// 先排序sort(nums.begin(),nums.end());for(i=0;i<nums.size();i++){//先确定第一个数//这个数和上一数不能大小相等if(i!=0 && nums[i]==nums[i-1]){continue;}for(j=i+1;j<nums.size();j++){if(j!=i+1 && nums[j]==nums[j-1]){continue;}k = nums.size()-1;while(k>j && nums[i]+nums[j]+nums[k]>0){k--;}if(k==j){break;}if(nums[i]+nums[j]+nums[k]==0){ans.push_back({nums[i], nums[j], nums[k]});}}}return ans;}
};

以上是我看了题解之后自以为懂了,但是提交之后仍然是超时!!

在这里插入图片描述
然后我又返回去看题解,不得不说还是上次看题解没有真正理解!o(╥﹏╥)o

算法思路

算法思路是这样滴
把三数之和转换成两数之和,也就是在每次循环第一个数时,就相当于把这个数确定下来了,这个时候,再分析剩下两个数的关系,如何让它们仨相加等于0就可以了。
与此同时,还需要注意几个点:

  1. i!=j and j!=k and i!=k
    三个数的下标不同,这个简单,循环的时候让第二个数的下标等于第一个数坐标+1就可
    (例如:j=i+1)

  2. 数组里有重复的数,但是输出要求不能有重复的数组
    首先给原数组排序,让相等的数挨着,才能用nums[j]!=nums[j-1]确保每次选的数之前没有选过。但是,例如:nums[j-1]注意不能和nums[i]相等,因此这个判断条件需要加上当j!=i+1的时候

  3. 时间复杂度的问题
    第一个数和第二个数都是用嵌套循环确定的,从左往右依次选取,时间复杂度已经是N^2了
    如果第三个数再嵌套实现,那还是N^3

    在每次对第一个数已经确定的情况下(假设第一个数为num1),对第二个数进行循环,因为每次都是从左往右,也就是从小到大选,那对第三个数来说:

    1. 如果从左往右选(从小到大),由于第二个数也是从小到大选,假设对于第二个数的某个值来说,存在num3满足num1+num2+num3=0。那么当这一轮结束,j+1,开始找num2’对应的num3’,使满足num1+num2’+num3’=0,此时,num2’肯定>num2,那说明num3’肯定要<num3,但是第三轮的循环,k初始为j+1,也就是从左往右选 ,那么,如果在最差的情况下,num3在n-1的下标处,相当于每次第二轮循环结束之后,k都要从j+1重新从左往右选取,这样下来时间复杂度就还是N^3,没有任何提升,还是AC不了。
    2. 如果从右往左选(从大到小),接着1.的开始找num2’对应的num3’,使满足num1+num2’+num3’=0说起,这时k的初始化为n-1,num2’>num2,需要num3’<num3,这样k就不用再重新初始化了,直接在上一个num3的下标位置再往左走就好,这样k的初始化应该在第二轮循环之前,第一轮循环之后,时间复杂度也就变成了N^2。即,k不是每次在第二个数循环里都需要初始化为k=n-1,(我上一个超时的代码就犯了这个错误

AC代码

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int i,j,k;vector<vector<int>> ans;// 先排序sort(nums.begin(),nums.end());for(i=0;i<nums.size();i++){//先确定第一个数//这个数和上一数不能大小相等if(i!=0 && nums[i]==nums[i-1]){continue;}k = nums.size()-1;for(j=i+1;j<nums.size();j++){if(j!=i+1 && nums[j]==nums[j-1]){continue;}while(k>j && nums[i]+nums[j]+nums[k]>0){k--;}if(k==j){break;}if(nums[i]+nums[j]+nums[k]==0){ans.push_back({nums[i], nums[j], nums[k]});}}}return ans;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

互联网+智慧运维管理平台建设方案

互联网智慧运维管理平台建设方案 随着信息技术的飞速发展&#xff0c;互联网与各行各业的深度融合已经成为大势所趋。在运维管理领域&#xff0c;传统的运维模式已经无法满足日益复杂的业务需求和技术环境。为了提升运维效率、降低运维成本、保障系统稳定运行&#xff0c;构建…

Adobe Illustrator (AI)小技巧总结

AI2024(64bit) Adobe Illustrator 软件安装包下载地址&#xff1a; 百度网盘下载https://pan.baidu.com/s/1C10-2JVN1rxFF5VFRuV2Yw?pwdSIMS 1.效果-扭曲与变换-变换&#xff0c;两个图形组合&#xff08;CtrlG&#xff09;中心点在中间 例&#xff1a;角度7.5副本24半圆48格…

【轮询负载均衡规则算法设计题】

一、题目描述 给定n台主机&#xff08;编号1~n&#xff09;和某批数据包&#xff0c;数据包格式为&#xff08;抵达主机时刻&#xff0c;负载量&#xff09;。这里数据每个时刻最多只有1条数据到达。负载量表示该主机处理此数据包总耗时。请计算轮询负载均衡规则下&#xff0c…

云平台关键技术 | 使用异步框架 celery 后台执行linux命令的实例

准备工作 (1) 环境 J1 server, CentOS7.9$ which gcc /home/wangjl/soft/gcc-12.3.0/bin/gcc$ which python3 /home/wangjl/soft/python3/python-3.10.14/bin/python3$ gcc --version gcc (GCC) 12.3.0 Copyright (C) 2022 Free Software Foundation, Inc.$ python3 -V Pytho…

计算机msvcp100.dll丢失怎么办,分享5种亲测有效的解决方法

电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是电脑提示缺失msvcp100.dll。这个问题可能会让我们感到困惑和烦恼&#xff0c;但是只要我们了解其原因并采取相应的解决方法&#xff0…

oracle 自动优化SYS_AUTO_SQL_TUNING_TASK操作

1、查询SYS_AUTO_SQL_TUNING_TASK在执行什么任务 select execution_name,status,execution_start,execution_end from dba_advisor_executions where task_nameSYS_AUTO_SQL_TUNING_TASK order by execution_start desc; select * from DBA_ADVISOR_SQLSTATS where execution_n…

数据仓库学习之hbase-2.2.7分布式搭建

hbase-2.2.7分布式搭建 1、上传解压配置环境变量 # 1、解压 tar -xvf hbase-2.2.7-bin.tar.gz.gz# 2、配置环境变量 vim /etc/profile# 3、在最后增加配置 export HBASE_HOME/usr/local/soft/hbase-2.2.7 export PATH$PATH:$HBASE_HOME/bin# 4、使环境变量剩下 source /etc/p…

Java常见规范及易忘点

文章目录 命名-注释-格式命名注释格式 语法规范易错点 命名-注释-格式 命名 类&#xff0c;接口&#xff0c;枚举&#xff0c;注解名用大驼峰命名 方法名&#xff0c;变量名小驼峰 静态常量全大写&#xff0c;下划线_分割 boolean类型 isError 小驼峰&#xff0c;不能isNo…

利用API推动业务创新

在数字化时代&#xff0c;企业不断创新以求生存和发展。API&#xff08;应用程序编程接口&#xff09;作为一种强大的技术工具&#xff0c;为业务创新提供了无限的可能性。通过正确地开发和应用API&#xff0c;企业能够打造生态系统&#xff0c;开拓新市场&#xff0c;提升用户…

Go AfterFunc 不触发

前言 函数原型为&#xff1a; func AfterFunc(d Duration, f func()) *TimerGo 的 time.AfterFunc 的作用是等待指定的时间间隔&#xff0c;然后在它自己的 goroutine 中调用 f。 现在有一个问题&#xff0c;我明明调用了 AfterFunc&#xff0c;但是它还没调用我指定的函数&…

FPGA+金融|硬件行情加速系统 打造极速交易场景

会议时间&#xff1a;2024年06月20日&#xff08;周四&#xff09;下午13:50 FPGA金融|硬件行情加速系统 打造极速交易场景_中科亿海微_芯有灵犀 智创未来

Python学习笔记12 -- 有关布尔值的详细说明

一、布尔表达式 最终值为true 或者false 二、常见形式&#xff1a; 1、常量&#xff1a;true false 2、比较运算&#xff1a; and &#xff01; 3、复合运算&#xff1a; and and or 4、其他 例&#xff1a;检测闰年&#xff1a; def specialYearMine(year):if (year%4 …

Elasticsearch集群运维,重平衡、分片、宕节点、扩容

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 参考 探索集群 Elasticsearch 中文文档 https://www.elastic.co/guide/en/elasticsearch/reference…

方差,标准差,CPK指标数据分析 (使用SQL做数据分析)

以下SQL语句&#xff0c;使用sqlserver数据库 方差的计算公式为&#xff1a; 方差 [(x1 - 平均数)^2 (x2 - 平均数)^2 … (xn - 平均数)^2] / n 其中 x1、x2、…、xn 是样本中的各个数据&#xff0c;n 是样本数量。 SELECT AVG(valu) AS avg_valu,COUNT(valu) AS cnt,SUM…

STM32高级控制定时器(STM32F103):TIM1和TIM8介绍

目录 概述 1 认识TIM1和TIM8 2 TIM1和TIM8的特性 3 TIM1和TIM6时基和分频 3.1 时基单元 3.2 预分频 3.3 时基和分频相关寄存器 3.3.1TIMx_CR1 3.3.2 TIMx_PSC 概述 本文主要介绍STM32高级定时器TIM1和TIM8的功能&#xff0c;还介绍了与之相关的寄存器的配置参数。包括…

SPOOL

-----How to Pass UNIX Variable to SPOOL Command (Doc ID 1029440.6) setenv只有csh才有不行啊PROBLEM DESCRIPTION: You would like to put a file name in Unix and have SQL*Plus read that file name, instead of hardcoding it, because it will change.You want to pa…

快速排序 -非递归版-双指针版

个人主页点这里~ 非递归法: 快速排序的非递归实现涉及到使用一个栈来模拟递归调用栈。 因为递归调用内存的栈区一般只有8M,如果数据很多则容易栈溢出(不过现在硬件基本不会),而使用数据结构的栈来模拟实现递归是调用堆区,一般右2G. //得到key int QuickSort1(int* a, int lef…

Sui Bridge在测试网上线并推出10万SUI激励计划

是一种为Sui设计的原生桥接协议&#xff0c;专门用于在Sui与其他网络之间桥接资产和数据。今天&#xff0c;Sui Bridge宣布在测试网上线。作为一种原生协议&#xff0c;Sui Bridge能够在Ethereum和Sui之间轻松且安全地转移ETH、wBTC、USDC和USDT&#xff0c;使其成为Sui基础设施…

如果R是唯一析因整环,那么R[x]也是唯一析因整环

【定义1】商域 如果 R R R是整环&#xff0c;那么则 R R R上的商域 K R K_{R} KR​定义为 K R { a b ∣ a , b ∈ R , b ≠ 0 } K_{R} \left\{ \frac{a}{b}|a,b \in R,b \neq 0 \right\} KR​{ba​∣a,b∈R,b0} 其中 a b a ′ b ′ ∈ K R ⇔ a b ′ a ′ b ∈ R \frac…

MYSQL 三、mysql基础知识 4(存储过程与函数)

MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起&#xff0c;应用程序无须关注存储过程和函数内部复杂的SQL逻辑&#xff0c;而只需要简单地调用存储过程和函数即可。 一、存储过程概述&#xff1a; 1.1理解&#xff1a; 含义&am…