【LeetCode】双指针求解和为s的两个数字

在这里插入图片描述

Problem: 剑指 Offer 57. 和为s的两个数字

文章目录

  • 题目解析
  • 算法思路分析
  • 复杂度
  • Code

题目解析

首先来讲解一下本题的思路

  • 我们看到本题的意思很简单,就是去这个nums这个数组中进行寻找,如果找到了两个数相加之和为target的话,那构成一个结果集并返回

1.jpg

算法思路分析

接下去我们来分析一下本题的思路

  1. 暴力解法
  • 首先第一种,我们都会想到的就是【暴力求解】,那就是使用两层for循环,去一一地做匹配工作,不过这种解法我们可想而知,一定会超时,所以这里不做过多的叙述
for(int i = 0;i < nums.size(); ++i)for(int j = i + 1;j < nums.size(); ++j)

2.jpg

  1. 利用单调性,使用双指针算法进行求解
  • 我们的话主要还是利用双指针的这种解法去解决本题,一个left指针指向最左端,一个right指针指向最右端,通过前后遍历去寻找哪两个数可以构成结果为【target】

3.jpg

  • 这里会出现三种情况,首先是第一种,若是我们碰到了nums[left] + nums[right] < target,那此时我们就可以去做一个取巧的工作
  • 读者可以再去仔细地阅读一下本题的题目意思,便可以知道这个数组序列是呈现递增排列的,那么既然【2】和最大的【21】都比target要来得小了,和【21】前面的这个几个数就要来得更小了,此时我们无需再去多次一举进行比较。此时只需执行left++

4.jpg

  • 接下去我们再来考虑一下这个nums[left] + nums[right] > target的情况,那我们知道这种情况也是不符合的,但是呢再去进行判断的时候我们还可以做进一步的简化
  • 读者可以先行思考一下,此时我们应该排除掉哪个数字呢?那很明显就是这个【21】,为什么呢?想一下这个【21】和最小的【11】都会超过target了,那么其余的【15】和【19】岂不是更加会超过了?
  • 所以呢这个【21】我们应该将其舍去才对,对应到代码即为right--

5.jpg

  • 那最后这一种的话就是找到了的情况,此时我们只需返回这两个数据的结果集的即可

6.jpg

复杂度

  • 时间复杂度:

考虑到最坏的情况,即为我们在遍历寻找的时候两个左右指针相遇了,即为没找到,那也就是把这个序列遍历了一遍,其时间复杂度 O ( n ) O(n) O(n)

  • 空间复杂度:

没有开辟任何额外的空间,所以空间复杂度为 O ( 1 ) O(1) O(1)

Code

以下是代码展示

  • 这里的话讲一下和这个{nums[left], nums[right]},可能有的小伙伴不是很清楚,此属于 C++初始化列表 的相关知识
  • 一般我们在LeetCode中返回两个数的集合时无需再去创建新的vector集合,而是会通过隐式类型转换构成一个vector集合进行返回
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;int sum = 0;while(left < right){sum = 0;sum = nums[left] + nums[right];if(sum < target){left++;}else if(sum > target){right--;}else{return {nums[left], nums[right]};}}return {-1, -1};}
};

在这里插入图片描述

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

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

相关文章

Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言

ps: 效果图放前面,符合的往下看&#xff0c;不符合的出门右转&#xff0c;希望多多点赞评论支持。 三种语言模式&#xff0c;分别是中文、英文、日文 批量翻译 最后的结果 配置vue-i18n 1、下载安装vue-i18n&#xff0c;9以上的版本。 2、创建对应文件夹 3、对应文件夹中代…

双键网络对讲求助模块

SV-6005 双键网络对讲求助模块 一、描述 SV-6005模块是我司的一款壁挂式一键求助对讲模块&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;实时解码播放&#xff0c;还配置了麦克风输入和扬声器输出。SV-6005模块可实现对讲、广播、监听等功能…

Qt下SVG格式图片应用

SVG格式图片介绍 svg格式图片又称矢量图&#xff0c;该种格式的图片不同于png等格式的图片&#xff0c;采用的并不是位图的形式来组织图片&#xff0c;而是采用线条等组织图片&#xff0c;svg格式是图片的文件格式是xml&#xff0c;可以通过文件编译器打开查看svg格式内容。 …

Mock接口测试

什么是mock? 测试桩&#xff0c;模拟被测对象的返回&#xff0c;用于测试 通常意义的mock指的就是mock server, 模拟服务端返回的接口数据&#xff0c;用于前端开发&#xff0c;第三方接口联调 为什么要mock? 1. 解决依赖问题&#xff1a;当我们测试一个接口或者功能模块…

【迪文屏幕】开发资料

1、应用手册 《T5L DGUSII 应用开发指南202306.pdf》&#xff0c;这个文档上面&#xff0c;详细介绍了各种控件的使用方法。 这个文档可以在官方论坛上找到&#xff0c;也可以直接在csdn上下载。 2、DGUS Tool 界面设计工具&#xff0c;根据所选屏幕的系统选择对应的工具&am…

andriod studio 手机模拟器中的文件导出方法

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录 阅读前请看一下&#xff1a;我是…

Lua03——开发环境搭建

1 安装开发插件 在 idea 或 vscode 中安装 lua 的开发插件 EmmyLua 2 创建工程 在 idea 中创建一个新的工程 工程的类型选择 lua 输入工程名及目标目录 在工程结构的SDK中设置lua在本地安装目录 在工程结构的modules中选择 lua 3 编写第一个lua程序 在工程下添加程序包&#…

WordPress(4)关于网站的背景图片更换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、更改的位置1. 红色区域是要更换的随机的图片二、替换图片位置三.开启随机数量四.结束前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也…

面试中的问题提问:如何通过提问展示你的主动性

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Windows11 设置移动热点 共享WIFI无线上网

Windows11 设置移动热点 共享WIFI无线上网 打开设置 键盘同时按下 windows i 在设置中点击 网络和 internet 移动热点 编辑移动热点参数 移动热点无接入上网设备 移动热点接入上网设备

string容器的常用操作

string容器的常用操作 一、C语言中的字符串二、string容器1、概念2、特点 三、string类对象的常见构造1、构造2、实际构造函数3、测试代码4、运行结果 四、赋值运算符1、类型2、作用3、测试代码4、运行结果 五、string类对象的容量操作1、成员函数2、测试代码3、说明4、运行结果…

Redis——认识Redis

简单介绍 Redis诞生于2009年&#xff0c;全称是Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 特征 键值&#xff08;Key-value&#xff09;型&#xff0c;value支持多种不同数据结构&#xff0c;功能丰富单线程&…