面试经典150题——两数之和 II - 输入有序数组

news2024/11/15 23:33:21

"The only limit to our realization of tomorrow will be our doubts of today." 

- Franklin D. Roosevelt

white and brown city buildings during daytime

1. 题目描述

2.  题目分析与解析

2.1 思路一——暴力求解

暴力求解的思路就是通过两次for循环,外层循环遍历整个数组,内层循环遍历剩下的部分,也可以将其理解为双指针。

但是这种解法的时间复杂度是O(n^2),是很高的。所以我们在想一想有没有什么其他更好的解法。

2.2 思路二——头尾双指针

因为题目说了数组是按照非递减顺序排列的,那么我们就要充分运用这个信息。而题目又要求两个数相加之和等于target,那么我们是不是就可以用两个指针来表示两个加数?

假设我们的两个指针一个指向数组的头命名为head,一个指向数组的尾命名为end,又因为数组是非递减的,是不是就相当于我的一个加数指向了最大值,一个加数指向了最小值

那么我们是不是就可以尝试head+end=target ?如果相等,我们就返回,如果head+end > target,那么我们就可以把最大值 end变小,这样整体的和就会变小,再尝试相加。如果 head+end < target,那么就尝试把小的值 head变大,这样整体的和就会变大,再尝试相加。具体如下:

这样得到的head与end就是最终需要的结果了。

现在我们再来讨论一下为什么这样就行,因为总感觉没有经过证明的东西拿起来就不是那么的稳。用直观的表示来讲,我们的head与end分别代表了整个数组中的最小值与最大值,而因为head后有所有更大的值,end前有所有更小的值。

  • 假设我们还是刚才示例的数组numbers={2, 7, 11, 15},那么该numbers的所有可能的和假设为集合A,那么 A={9, 13, 17, 18, 22, 26}

  • 所以假设head自始至终都不动,end不断前移,也就是我们能从当前和一直变到整个可能性集合A中最小的和也就是 9 如下图所示:

  • 而如果假设end不动,head不断后移,也就是我们能从当前和一直变到整个可能性集合A中最大的和也就是 26 如下图所示:

现在我们再来看细一点:numbers的所有和的集合 A={9, 13, 17, 18, 22, 26},假设head还是指向头部,end还是指向尾部,下图第一行表示 end前移,而第二行表示head后移:

可以发现除了一个中间的和 18 其它的值都被覆盖了。而此时如果将head后移一位,再重复上述图示的步骤,肯定能获取到 18

其实也就是表示我通过head与end相加,以及通过head后移和end前移,肯定可以遍历出整个numbers可能的和的集合A的所有元素,而我的target肯定在A中,因为题目说了 仅存在一个有效答案

而换个解释就是说:我们的head和end相加的值,因为和target进行了比较,小了就变大,打了就变小,所以说就是不断向target收缩的过程,假设我们的 target=18

通过小了就变大,大了就变小的原则,不断向target靠近,直到找到target。所以通过这种方法

  • 第一能找到所有可能的和,不用担心缺了某一个和而导致找不到target。

  • 第二我是通过不断向目标收缩的过程去找寻目标,而目标肯定在我的到的小了与大了的范围之内,拿上述例来说就是 17小了 和 22大了 这个【17,22】范围之内,而我是有小了就变大和大了就变小的原则,因此只能在17和22这个范围不断收缩,这样就能不断贴近目标直到找到目标。

思路二:更好的解释(引自Leetcode nettee)

(侵权请告知,立删)

3. 代码实现

3.1 思路一——暴力求解

3.2 思路二——头尾双指针

4. 运行结果

4.1 思路一——暴力求解

4.2 思路二——头尾双指针

5. 相关复杂度分析

5.1 思路一——暴力求解

  • 时间复杂度:O(n^2),其中 n 是数组的长度。遍历数组的每个元素,每个元素还需要遍历其后面的元素。

  • 空间复杂度:O(1)。

5.2 思路二——头尾双指针

  • 时间复杂度:O(n),其中 n 是数组的长度。两个指针移动的总次数最多为 n 次。

  • 空间复杂度:O(1)。

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

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

相关文章

蓝桥杯Web应用开发-CSS3 新特性【练习二:获得焦点验证】

页面上有一个姓名输入框和一个密码输入框&#xff0c;当聚焦输入框时&#xff0c;输入框的背景颜色会发生改变&#xff0c; 新建一个 index3.html 文件&#xff0c;在其中写入以下内容。 <!DOCTYPE html> <html lang"en"><head><meta charset&…

画出TCP三次握手和四次挥手的示意图,并且总结TCP和UDP的区别

三次握手 第一次握手&#xff1a;客户端发送SYN包&#xff08;SYN1, seq0&#xff09;给服务器&#xff0c;并进入SYN_SENT状态&#xff0c;等待服务器返回确认包。第二次握手&#xff1a;服务器接收到SYN包&#xff0c;确认客户端的SYN&#xff0c;发送ACK包&#xff08;ACK1 …

c语言--指针数组(详解)

目录 一、什么是指针数组&#xff1f;二、指针数组模拟二维数组 一、什么是指针数组&#xff1f; 指针数组是指针还是数组&#xff1f; 我们类比一下&#xff0c;整型数组&#xff0c;是存放整型的数组&#xff0c;字符数组是存放字符的数组。 那指针数组呢&#xff1f;是存放…

css绘制向左三角形_纯css 实现三角形

首先这个思路的讲解 就是用到了 border 边框这个属性 一个div 可以设置四边边框 我们先把其他三条边都去掉 只留下一个边框 其他 在设置底边框的宽度 再把内容区域设置为0 就可以了 下面是代码 <div></div>div {width:0;height:0;border-top:30px solid red ;bor…

Django前后端分离之后端实践

django-admin startproject djweb 生成djweb项目 django-admin startapp news 生成news应用 配置models文件 class NewInfo(models.Model):title models.CharField(max_length30)content models.TextField()b_date models.DateField()read models.IntegerFie…

操作系统-信号量机制(整型信号量 记录型信号量)与用信号量实现进程互斥,同步,前驱关系

文章目录 信号量机制总览信号量机制整型信号量记录型信号量例子记录型信号量小结 小结 用信号量实现进程互斥&#xff0c;同步&#xff0c;前驱关系总览信号量机制实现进程互斥信号量机制实现进程同步进程同步信号量实现进程同步 信号量机制实现前驱关系小结 信号量机制 总览 …

mysql项目实战,常用sql语句的实战笔记

1.使用sql语句对数据库进行创建 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20) NOT NULL COMMENT 学生姓名,ssex VARCHAR(10) NOT NULL…

北斗导航助力春运,让回家之路更温馨便捷

北斗导航助力春运&#xff0c;让回家之路更温馨便捷 春运&#xff0c;即春节运输&#xff0c;是中国在农历春节前后发生的一种大规模的高交通运输压力的现象。它它不仅考验着国家的交通运输能力&#xff0c;也考验着公共服务和应急管理的水平。在这样一个背景下&#xff0c;北…

计算机毕业设计 | SpringBoot大型旅游网站 旅行后台管理系统(附源码)

1&#xff0c; 概述 1.1 项目背景 随着互联网技术的快速发展和普及&#xff0c;旅游行业逐渐转向线上&#xff0c;越来越多的游客选择在线预订旅游产品。传统的线下旅行社模式已不能满足市场需求&#xff0c;因此&#xff0c;开发一个高效、便捷的旅游网站成为行业的迫切需求…

L1-080 乘法口诀数列

一、题目 二、解题思路 三、代码 #include<iostream> using namespace std; int main() {int a1,a2,n;cin>>a1>>a2>>n;if(n1){cout<<a1;return 0; }int a[n*2];cout<<a1<<" "<<a2;a[0]a1;a[1]a2;for(int i2,j2;i&l…

NX/UG二次开发—其他—矩形套料(排料)简介

算法逻辑 排料方法一定时间内获取近似解的算法 看了一些论文和博客&#xff0c;一般排料方法采用最低水平线算法排料&#xff0c;再此基础上增加空余区域填充。 然后配合遗传学算法||模拟退火算法||蚁群算法||免疫算法等&#xff0c;在一定时间内求得一组最优解。 在最简单的…

Windows 启动项无法打开 Aanconda 问题。pyqt noBinding

windows中点击Anaconda navigator 没有反应: ## 解决 (右键运行Anaconda prompt) 以管理员身份运行&#xff1a; 分别运行以下命令&#xff1a; conda update conda conda update anaconda-navigatorpip uninstall PyQt5 pip install PyQt5 pip install pyqtwebengine

Spring GateWay

概述简介 能干什么 反向代理 鉴权 流量控制 熔断 日志监控 Spring Cloud Gateway 与Zuul的区别 在SpringCloud Finchley正式版之前&#xff0c;Spring Cloud推荐的网关是 Netflix提供的Zuul: 1、Zuul 1.x&#xff0c;是一个基于阻塞Ⅳ/O的APl Gateway 2、Zuul 1.x基于Servl…

双非本科准备秋招(19.1)—— Synchronized优化

轻量级锁 流程 一个对象虽然有多线程加锁&#xff0c;但是加锁时间是错开的&#xff0c;那么可以用轻量级锁优化。 语法还是synchronized&#xff0c;只是对使用者是透明的。 static final Object obj new Object(); public static void method1() {synchronized( obj ) {//…

Unity AnimationRigging无法修改权重?

个人理解&#xff0c;已解决无法修改权重的问题: unity自带的动画系统是在FixUpdate和Update之后LateUpdate之前执行&#xff0c;如果在这FixedUpdate或Update函数内更新AnimationRigging内的权重后&#xff0c;内部动画系统会覆盖权重的修改&#xff0c;导致无法正确更新&…

C语言:函数递归

创作不易&#xff0c;给个三连吧&#xff01;&#xff01; 一、什么是递归 递归式一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是自己调用自己。 递归的思想&#xff1a; 把⼀个⼤型复杂问题层层转化为⼀个与原问题相似&#xff0c;但规模较小的⼦问题来求解…

FPC概述及仿真

柔性印刷电路(FPC)是由聚酰亚胺或聚酯薄膜制成的高可靠性和优异的柔性印刷电路板。它具有布线密度高、重量轻、厚度薄、可弯曲性好等特点。 概述 FPC&#xff0c;也被称为柔性印刷电路&#xff0c;因其重量轻&#xff0c;厚度薄&#xff0c;自由弯曲和折叠等优异特性而受到青睐…

Nicn的刷题日常之操作一维数组

1.题目描述 创建一个整形数组&#xff0c;完成对数组的操作 实现函数init() 初始化数组为全0实现print() 打印数组的每个元素实现reverse() 函数完成数组元素的逆置。 要求&#xff1a;自己设计以上函数的参数&#xff0c;返回值。 2.解题 void Init(int arr[], int sz, …

网站被攻击有什么办法呢?

最近&#xff0c;德迅云安全遇到不少网站用户遇到攻击问题&#xff0c;来咨询安全解决方案。目前在所有的网络攻击方式中&#xff0c;DDoS是最常见&#xff0c;也是最高频的攻击方式之一。不少用户网站上线后&#xff0c;经常会遭受到攻击的困扰。有些攻击持续时间比较短影响较…

TI毫米波雷达开发——High Accuracy Demo 串口数据接收及TLV协议解析 matlab 源码

TI毫米波雷达开发——串口数据接收及TLV协议解析 matlab 源码 前置基础源代码功能说明功能演示视频文件结构01.bin / 02.binParseData.mread_file_and_plot_object_location.mread_serial_port_and_plot_object_location.m函数解析configureSport(comportSnum)readUartCallback…