前端工程师leetcode算法面试必备-二分搜索算法(下)

news2024/11/17 15:52:49

一、287. 寻找重复数

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

1、HashMap

在没有其它附加条件的情况下,读者第一时间会想到通过 HashMap 来记录出现过的数字,从而找到重复数:

在这里插入图片描述

上述实现代码的时间复杂度和空间复杂度都为 O(n),如果只允许使用 O(1) 的空间复杂度,该如何解决这道题目呢?

2、Binary Search

这种条件下,最容易想到的就是通过两重循环暴力搜索当前数字是否与后面的数字重复的方法来解决,但是这种方案的时间复杂度为 O(n^2),既然涉及到了搜索,就可以尝试通过二分搜索算法将时间复杂度降低到 O(nlogn)。

根据前面的刷题经验,可以很容易地找出有序数组:1 到 n 的递增整数序列

接下来的难点就是通过重复数的特性来确定下一轮搜索区间是落在左半区间还是右半区间:

  • 首先需要遍历 nums 数组,获取不大于当前中间数的数字的个数;

  • 如果个数大于中间数,那么下一轮搜索区间落在左半区间;

  • 如果个数小于中间数,那么下一轮搜索区间落在右半区间;

在这里插入图片描述

二、209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。

1、Binary Search

这道题目中的有序数组不太好找,需要用到一个技巧:构造前缀和数组

参考视频:传送门

  nums = [2, 3, 1, 2, 4, 3]

  # 前缀和

  sums = [0, 2, 5, 6, 8, 12, 15]

从而上述示例中可以发现前缀和数组是一个有序数组,那么对于任意 i 到 j 的连续子数组之和,可以通过 sums[j+1] - sums[i] 求出

并且根据前缀和的差值与 s 的比较,可以判断满足条件的连续子数组的终止下标落在哪个区间内。

在这里插入图片描述

通过前缀和对数组的预处理以及二分搜索算法,时间复杂度为 O(nlogn)。

2、Two Points

除了上述二分搜索算法的处理方法之外,可能最简单暴力的方法就是通过嵌套循环找出长度最小的连续子数组,但是这种方法的时间复杂度为 O(n^2),有没有方法将其降低到 O(n) 的时间复杂度呢?。

这里就要提及一下滑动窗口算法,它常用于处理连续子元素问题,将嵌套循环问题转化为单循环问题。

在这里插入图片描述

在本题中,通过头指针和尾指针维护当前连续子数组的和值窗口:

  • 当前窗口的和值大于 s ,那么头指针向后移动一位;

  • 当前窗口的和值小于 s ,那么尾指针向后移动一位;

在这里插入图片描述

三、153. 寻找旋转排序数组中的最小值

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。

这一类型的题目在 Easy 中也出现过,如:【852. 山脉数组的峰顶索引】和【162. 寻找峰值】。

本题中,原本的递增数组被转化成包含两个递增序列的数组,并且其中无重复元素,那么就可以得出:第一个递增数组中的任意一个元素都大于第二个递增数组中的元素

有了这一关键信息,对于任一中间数,都可以将其与当前搜索区间的最后一个元素相比较,从而知道当前中间数在哪一个递增序列上,而所求的最小值存在于第二个递增序列的头部,那么不断将搜索区间往这一方向收缩,即可得到最小值:

在这里插入图片描述

四、33. 搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。

这道题是【153. 寻找旋转排序数组中的最小值】的进阶题型。

在 153 中,只需要将搜索区间不断向第二个递增区间收缩,即可得到最小值。而本题中的目标值的位置并不确定,所以在每次确定搜索区间时,需要考虑很多种情况:

  • 如果当前搜索区间只落在一个递增区间上,那么和一般的处理方法没什么异样;

  • 如果当前搜索区间横跨两个递增区间,那么就需要根据中间数在第一个递增区间还是第二个递增区间上分别处理;

具体的条件判断,请查看下面的代码实现:

在这里插入图片描述

五、81. 搜索旋转排序数组 II

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

这道题目在【33. 搜索旋转排序数组】的基础上去除了”不存在重复元素“这一条件。

回顾 33 题的解法,在寻找下一个搜索区间时,通过该搜索区间的头部元素和尾部元素的比较得出当前搜索区间是否横跨两个递增序列。一旦没有无重复元素这一条件,那么根据头尾两个元素无法判断当前搜索区间是否横跨两个递增序列。

本题要求计算元素的存在性,那么一个元素的重复元素对其存在性是没有任何影响的,所以只要在二分搜索的过程中,剔除掉头尾部的重复元素即可:

在这里插入图片描述

写在最后

算法作为计算机的基础学科,用 JavaScript 刷,一点也不丢人ε=ε=ε=┏(゜ロ゜;)┛。

本系列文章会分别给出一种算法的3种难度的总结篇(简单难度,中等难度以及困难难度)。在简单难度中,会介绍该算法的基本知识与实现,另外两个难度,着重讲解解题的思路。

如果本文对您有所帮助,可以点赞或者关注来鼓励博主。

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

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

相关文章

直属领导和老板都给了我绩效A,HR最后审核时降成了B,平时没有得罪她,她为什么这么做?...

绩效考核时,谁才是最终决定你绩效那个人?一位网友最近遇到了这样一件糟心事:季度绩效,直属领导和老板都给了A,人事最后审核时给降成了B,平时和人事没什么工作交集,按理说没有得罪她,…

Java工具——MySQL介绍与安装

Java工具——MySQL介绍与安装MySQL数据库介绍1. 简介2. MySQL发展历史MySQL数据库安装1. 下载安装包2. 安装3. 配置环境变量MySQL数据库介绍 1. 简介 MySQL是应用最广泛、普及度最高的开源关系型数据库,MySQL由瑞典MySQL AB公司开发,目前属于Oracle旗下…

Opencv 基本操作七 提取两幅图像的重叠区域

使用opencv提取连个图像的重叠区域,其本质就是提取两个图像的特征点,然后对两个图像的特征点进行匹配,根据匹配的特征点计算出透视变换矩阵H,然后根据H即可提取出两个图像的重叠区域。这里要注意的是,普通的opencv库没…

Kali Linux断网攻击

前言 ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。 一句话解释: 断…

2022年总结 | 从初二学生到算法作者的蜕变之路

目录 一年的创作历程 我和 CSDN 在编程竞赛的合作 About CBC 技术社区的发展 夜跑奇遇 About 博客之星 新年致谢 元旦祝福 一年的创作历程 2022年,这一年对于我来说是十分重要的一年。在这一年里,我作为一名初二在校学生,在CSDN上发布…

2003-2021年高铁站开通时间

2003-2021年高铁站开通时间数据 1、时间:2003-2021年 2、指标:高铁站名称、开通时间、所在省份、所在城市、所属线路名称、以及相关备注 3、指标说明: 高速铁路,简称高铁,是指设计标准等级高、可供列车安全高速行驶…

需要提醒你关于 golang 中 map 使用的几点注意事项

日常的开发工作中,map 这个数据结构相信大家并不陌生,在 golang 里面,当然也有 map 这种类型 关于 map 的使用,还是有蛮多注意事项的,如果不清楚,这些事项,关键时候可能会踩坑,我们…

【攻防世界】Web warmup

知识点讲解 这一题主要是利用了include的特性 如果include的文件名中含有“/”,那么它会识别其为一个带目录的文件,只有最后一个“/”后的字符串对应的文件会被包含,而前面的字符串都只是在指定目录 意思是,如果我们的payload是这…

ArcGIS基础实验操作100例--实验36创建特征线约束TIN

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验36 创建特征线约束TIN 目录 一、实验背景 二、实验数据 三、实验步骤 (1…

搜狗PR权重在线查询,搜狗PR值查询方法

什么是搜狗PR权重? 搜狗权重(SogouRank)是由搜狗搜索引擎官方发布网页评级数据,搜狗权重是搜狗衡量网页重要性的指标,是机器根据搜狗评级算法自动计算出来的。搜狗权重值从1至10不等,网页评级越高,该网页在搜索中越…

异步通信技术AJAX | AJAX乱码问题、异步与同步、手动封装一个jQuery库

目录 一:快速搞定AJAX(第三篇) 1、AJAX乱码问题 2、AJAX的异步与同步 3、AJAX代码封装 4、手动封装一个jQuery库 一:快速搞定AJAX(第三篇) 1、AJAX乱码问题 (1)发送ajax get 或…

2022年我的22个感悟

这些感悟,有些是我自己感悟出来的;更有一些,是别人说的,引起了我的共鸣或深思。这些感悟,可能没有什么实用价值,但能让人对这个世界多一份思考。1. 现代社会的奴隶“小工是酒店或餐馆的奴隶,而他…

7-10 网红点打卡攻略

一个旅游景点,如果被带火了的话,就被称为“网红点”。大家来网红点游玩,俗称“打卡”。在各个网红点打卡的快(省)乐(钱)方法称为“攻略”。你的任务就是从一大堆攻略中,找出那个能在…

Python解题 - CSDN周赛第19期 - 醉酒的狱卒

本期题目依然难度不高,可惜状态不佳,未能取得满分,而且解题的思路也没能做到最简,直到赛后才想到还可以有另外的有趣的解法。我想这本身也是比赛的乐趣之一吧,不识庐山真面目,只缘身在此山中。 第一题&…

【阶段一】Python快速入门03篇:数据结构-元组、字典与集合

本篇的思维导图: 数据结构-元组 元组的概念 元组(tuple)虽然与列表类似,但也有不同之处,元组的元素不能修改;元组使用小括号,而列表使用中括号。 新建一个元组 元组的创建比较简单,直接将一组数据元素用小括号括起来即可。

第1章 生物和生物圈

张惠怡*,张钊* (萧县城东初级中学,淮北师范大学计算机科学与技术学院,安徽 淮北,安徽 宿州) *These authors contributed to the work equllly and should be regarded as co-first authors. 🌞欢迎来到生物的世界 …

校招前端二面高频vue面试题

vue-router中如何保护路由 分析 路由保护在应用开发过程中非常重要,几乎每个应用都要做各种路由权限管理,因此相当考察使用者基本功。 体验 全局守卫: const router createRouter({ ... }) ​ router.beforeEach((to, from) > {// .…

【LeetCode每日一题】——263.丑数

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数学 二【题目难度】 简单 三【题目编号】 263.丑数 四【题目描述】 丑数 就是只包含质因数 …

3GPP R17 RedCap

什么是RedCap RedCap,即Reduced Capability的简称,在早期的3GPP讨论过程中,它也被称为NR Light。RedCap是针对IoT场景,为了降低终端复杂度、成本和功耗而提出。相比NR标准版本,RedCap主要在如下几个方面做了简化&#…

C++语言级别的多线程

1.线程概念 好处:可以跨平台:windows / linux / mac 线程间的互斥:mutex / lock_quard / unique_lock 线程间的通信:condition_variable atomic : 原子类型 基于CAS操作的原子类型 线程安全的 sleep_for :睡眠 C语言层面调用thre…