当前位置: 首页 > news >正文

【二分查找】Leetcode例题

【1】69. x 的平方根 - 力扣(LeetCode)

🍡解题思路:首先想到的是暴力查找,从1开始依次比较x与num*num的大小,然后找出满足num*num<=x且(num+1)*(num+1)>x的num值;再来看看能不能优化一下,因为是有序的比较,因此可以考虑使用二分查找算法来解决此题。

🍡算法原理:首先找出二段性,观察发现,所求出算数平方根只保留整数部分,因此可以将结果值划分到左段,将num*num<=x的划分为一段,num*num>x的划分为另一段,根据我之前发过的二分查找算法模板介绍的博客(【二分查找】模板+例题),可以发现这就是典型的查找右端点的二分查找算法,找出条件判断语句的判断条件即可求解

🍡解题步骤:

1)定义左右边界left,right

2)定义循环判断条件left<right

3)设置mid值,由于是右端点二分查找算法,因此是mid=left+(right-left+1)/2(不清楚为什么的可以看看【二分查找】模板+例题)

4)编写条件判断语句:

1.若mid*mid<=x,left=mid

2.若mid*mid>x,right=mid-1

细节处理:由于题目是从0开始的,因此小于1的

注意:由于题目给出的数字范围太大,可能会出现溢出情况,因此mid用longlong类型,left和right也可以设置成longlong类型;

🍡实现代码:

    int mySqrt(int x) {if(x<1)return 0;int left=1;int right=x;while(left<right){long long mid=left+(right-left+1)/2;if(mid*mid<=x){left=mid;}else if(mid*mid>x){right=mid-1;}}return left;}

【2】35. 搜索插入位置 - 力扣(LeetCode)

🍡解题思路:首先想到暴力查找,依次比较nums[i]与target的大小,如果nums[i]>=target那么就输出对应位置下标,但是题目要求时间复杂度为O(logN),因此考虑使用二分查找算法解决

🍡算法原理:可以发现数组的二段性,将数组划分为x<target和x>=target两部分,要求解包含在x>=target部分,很明显是寻找左端点的二分查找

🍡解题步骤:

1)定义左右边界left,right

2)定义循环判断条件left<right

3)设置mid值,由于是左端点二分查找算法,因此是mid=left+(right-left)/2

4)编写条件判断语句:

1.若nums[mid]<target,left=mid+1

2.若nums[mid]>=target,right=mid

细节处理:如果target的值比nums中所有元素都要大,插入位置就是nums.size(),即nums的下一个位置的下标;如果不单独写,输出的就是nums最后一个位置下标,是错误的。

🍡实现代码:

int searchInsert(vector<int>& nums, int target) {int sz=nums.size();if(target<nums[0]){return 0;}else if(target>nums[sz-1]){return sz;}int left=0;int right=sz-1;int mid=0;while(left<right){mid=left+(right-left)/2;if(nums[mid]>=target){right=mid;}else if(nums[mid]<target){left=mid+1;}}return right;}

 【3】852. 山脉数组的峰顶索引 - 力扣(LeetCode)

🍡解题思路:题目要求的峰值元素,比左右两侧的元素都要大,因此可以通过比较相邻元素的大小来确定峰值元素位置

🍡算法原理:寻找二段性,会发现峰值左侧元素都是比它下一个元素小,峰值右侧(包含峰值在内)都是比它下一个元素大;这样就划分出了二段性,会发现是寻找左端点的二分查找算法。

(同理,也可以通过将当前元素与上一个元素比较,将峰值划分在左侧,通过寻找右端点的二分查找算法求解)

🍡解题步骤:

1)定义左右边界left,right

2)定义循环判断条件left<right

3)设置mid值,由于是左端点二分查找算法,因此是mid=left+(right-left)/2

4)编写条件判断语句:

1.若arr[mid]<arr[mid+1],left=mid+1

2.若arr[mid]>arr[mid+1],right=mid

🍡实现代码:

    int peakIndexInMountainArray(vector<int>& arr) {int left=0;int right=arr.size()-1;while(left<right){int mid=left+(right-left)/2;if(arr[mid]>arr[mid+1]){right=mid;}else if(arr[mid]<arr[mid+1]){left=mid+1;}}return left;}

【4】162. 寻找峰值 - 力扣(LeetCode)

🍡解题思路:可以分为三种情况:

1、完全上升趋势

2、完全下降趋势

3、波折曲线

三种情况能找到峰值,因为nums的左侧趋向于-∞,右侧趋向于+∞;如果是情况1,那么最右侧元素就是峰值;如果是情况2,那么最左侧元素就是峰值;如果是情况3可以找到其中一个峰值。观察发现,若nums[i]>nums[i+1],那么该值右侧呈现下降趋势,而nums最左侧趋向于-∞,因此该值左侧一定存在一个峰值;而当nums[i]<nums[i+1],同理该值右侧一定存在一个峰值

🍡算法原理:通过上述分析,可以得到二段性,当nums[i]>nums[i+1](包含峰值元素在内)时,向左搜索;当nums[i]<nums[i+1]时,向右搜索。因此可以使用左端点的二分查找算法

🍡解题步骤:

1)定义左右边界left,right

2)定义循环判断条件left<right

3)设置mid值,由于是左端点二分查找算法,因此是mid=left+(right-left)/2

4)编写条件判断语句:

1.若nums[mid]<nums[mid+1],left=mid+1

2.若nums[mid]>=nums[mid+1],right=mid

🍡实现代码:

    int findPeakElement(vector<int>& nums) {int left=0;int right=nums.size()-1;while(left<right){int mid=left+(right-left)/2;if(nums[mid]>nums[mid+1])//找出二段性{right=mid;}else if(nums[mid]<nums[mid+1]){left=mid+1;}}return left;}

【5】153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

🍡解题思路:旋转之后变为两段升序数组,通过观察找到二段性,利用二分查找求解

🍡算法原理:可以发现旋转之后AB段的元素都比最后一个元素D的值大,而CD段元素(包含最小值在内)都比元素D的值小;因此划分出二段性。可以发现可利用左端点的二分查找求解

🍡解题步骤:

1)定义左右边界left,right

2)定义循环判断条件left<right

3)设置mid值,由于是左端点二分查找算法,因此是mid=left+(right-left)/2

4)编写条件判断语句:

1.若nums[mid]>nums[sz],left=mid+1

2.若nums[mid]<=nums[sz],right=mid

🍡实现代码:

    int findMin(vector<int>& nums) {int left=0;int right=nums.size()-1;int sz=nums.size();while(left<right){int mid=left+(right-left)/2;if(nums[mid]>nums[sz-1]){left=mid+1;}else{right=mid;}}return nums[right];}

【6】LCR 173. 点名 - 力扣(LeetCode)

🍡解题思路:可以求解的方式有很多,可以通过累加和的方式求解,也可以通过元素与下标待遇比的方式求解。同样也能用二分查找的方式求解

🍡算法原理:寻找二段性,可以发现缺失值左侧元素的下标值都和元素值相等,而右侧元素的下标值都和元素值不相等,因此根据这个特性划分出二段性

🍡解题步骤:

1)定义左右边界left,right

2)定义循环判断条件left<right

3)设置mid值,如果是右端点二分查找算法,因此是mid=left+(right-left)/2

4)编写条件判断语句:

1.若records[mid]==mid,left=mid+1

2.若records[mid]!=mid,right=mid

细节:右端点二分查找和左端点二分查找都行,要不就是插入元素左侧要不就是插入元素右侧,只需要最后返回的时候判断一下即可。可能存在records=[1,2,3]这种情况,定位在第一个元素;存在records=[0,1,2,3]这种情况,定位在最后一个元素的下一个;如果这两种情况单独考虑,那么使用右端点二分,就可以return left+1;而使用左端点二分,就可以return left-1;

为了方便起见,可以直接判断一下while结束之后在插入元素左侧还是右侧再来确定返回值即可

🍡实现代码:

    int takeAttendance(vector<int>& records) {int left=0;int right=records.size()-1;//找出二段性,缺失值左侧都是等于下标,右侧都是!=下标while(left<right){int mid=left+(right-left+1)/2;if(records[mid]!=mid)right=mid-1;elseleft=mid;}return left==records[left]?(left+1):left;//如果是缺失值左侧元素,left+1就是缺失值;如果是缺失值右侧元素,那么left就是缺失值}
    int takeAttendance(vector<int>& records) {int left=0;int right=records.size()-1;if(records[0]!=0) return 0;if(records[right]==right) return right+1;//找出二段性,缺失值左侧都是等于下标,右侧都是!=下标while(left<right)//左端点的二分{int mid=left+(right-left+1)/2;if(records[mid]!=mid)right=mid-1;elseleft=mid;}//return left==records[left]?(left+1):left;return left+1;}
    int takeAttendance(vector<int>& records) {int left=0;int right=records.size()-1;if(records[0]!=0) return 0;if(records[right]==right) return right+1;//找出二段性,缺失值左侧都是等于下标,右侧都是!=下标while(left<right)//右端点的二分{int mid=left+(right-left)/2;if(records[mid]!=mid)right=mid;elseleft=mid+1;}//return left==records[left]?(left+1):left;return left;}

相关文章:

【二分查找】Leetcode例题

【1】69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; &#x1f361;解题思路&#xff1a;首先想到的是暴力查找&#xff0c;从1开始依次比较x与num*num的大小&#xff0c;然后找出满足num*num<x且(num1)*(num1)>x的num值&#xff1b;再来看看能不能优化一下&…...

gitlab配置调试minio

官方文档 rails console 调试 查看配置Settings.uploads.object_store加载minio clientrequire fog/awsfog_connection Fog::Storage.new(provider: AWS,aws_access_key_id: 你的MINIO_ACCESS_KEY,aws_secret_access_key: 你的MINIO_SECRET_KEY,region: <S3 region>,e…...

Vue实战技巧:如何展示附件(PDF、MP4、Excel、Zip等)并修改名称下载

大家好&#xff0c;今天给大家分享一篇关于在Vue项目中展示附件&#xff08;PDF、MP4、Excel、Zip等&#xff09;并修改名称下载的教程。在实际开发过程中&#xff0c;这个功能非常实用&#xff0c;下面我们就一起来学习一下。 一、准备工作 首先&#xff0c;确保你的项目中已经…...

AI证件照制作 API 对接说明

AI证件照制作 API 对接说明 本文将介绍一种 AI证件照制作 API 对接说明&#xff0c;它是可以通过输入人像照片URL以及自己喜欢的模板来制作各种风格的证件照。 接下来介绍下 AI证件照制作 API 的对接说明。 申请流程 要使用 API&#xff0c;需要先到 AI证件照制作 API?inv…...

Macos用brew安装Nodejs亲手教程

首先确保brew已安装&#xff0c;搜索node资源&#xff0c;命令如下&#xff1a; brew search nodejs 演示结果如下&#xff1a; 安装nodejs brew install node22 或 brew install node 出现如下界面 表示正在安装&#xff0c;安装成功后&#xff0c;提示如下信息&#xff1…...

Node.js 新手教程

1、nodejs简介 Node.js 是一个开源和跨平台的 JavaScript 运行时环境。它是几乎所有类型项目的流行工具&#xff01; Node.js 在浏览器之外运行 V8 JavaScript 引擎&#xff08;Google Chrome 的核心&#xff09;。这使得 Node.js 的性能非常出色。 Node.js 应用程序在单个进…...

Latex转word(docx)或者说PDF转word 一个相对靠谱的方式

0. 前言 投文章过程中总会有各种各样的要求&#xff0c;其中提供word格式的手稿往往是令我头疼的一件事。尤其在多公式的文章中&#xff0c;其中公式转换是一个头疼的地方&#xff0c;还有很多图表&#xff0c;格式等等&#xff0c;想想就让人头疼欲裂。实践中摸索出一条相对靠…...

前端热门面试题目——React、Node

img 标签的 srcset 属性的作用 srcset 属性允许开发者为不同设备或分辨率提供多个图像选项&#xff0c;优化加载的图片以适应设备的屏幕大小和分辨率。这提高了性能和用户体验。 示例&#xff1a; <img src"default.jpg" srcset"small.jpg 480w, medium.j…...

Ansible自动化一键部署单节点集群架构

自动化部署利器&#xff1a;Ansible 一键部署脚本 在现代IT基础设施管理中&#xff0c;Ansible以其简洁、强大的自动化能力脱颖而出。以下是精心打造的Ansible自动化一键部署脚本&#xff0c;旨在简化部署流程&#xff0c;提升效率&#xff0c;确保一致性和可靠性。 通过这个…...

电脑插入耳机和音响,只显示一个播放设备

1. 控制面板-硬件和声音-Realtek高清音频-扬声器-设备高级设置-播放设备里选择使用前部和后部输出设备同时播放两种不同的音频流 在声音设置中就可以看到耳机播放选项...

家政小程序开发,打造便捷家政生活小程序

目前&#xff0c;随着社会人就老龄化和生活压力的加重&#xff0c;家政服务市场的需求正在不断上升&#xff0c;家政市场的规模也正在逐渐扩大&#xff0c;发展前景可观。 在市场快速发展的影响下&#xff0c;越来越多的企业开始进入到市场中&#xff0c;同时家政市场布局也发…...

tcpdump抓包wireshark分析

背景 分析特定协议的数据包&#xff0c;如 HTTP、DNS、TCP、UDP 等&#xff0c;诊断网络问题&#xff0c;例如连接故障、延迟和数据包丢失。 大概过程 1.安装tcpdump yum update yum install tcpdump2.抓包&#xff0c;从当前时间起&#xff0c;一小时后停止&#xff0c…...

文件无法直接拖入zotero

解决方法&#xff1a;取消管理员权限打开zotero。 具体如下&#xff1a;右键zotero应用程序&#xff0c;打开属性&#xff0c;选择“兼容性”&#xff0c;点击底下的“更改所有用户的设置”&#xff0c;在弹出的框中取消“以管理员身份运行此程序”。如下所示&#xff1a;...

使用 useMemo 和 React.memo 优化 React 组件渲染

在 React 中&#xff0c;性能优化是一个重要的主题&#xff0c;特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemo 和 React.memo 来优化子组件的渲染。 1. 组件结构 创建一个父组件&#xff0c;包含两个子组件&#xff1a; MemoChild&#xff1a;使用 R…...

ISAAC SIM踩坑记录--添加第三方3D场景

ISAAC SIM仿真首先就是要有合适的3D场景&#xff0c;官方提供了一些场景&#xff0c;如果不能满足要求&#xff0c;那就只能自己建。 对于我这种不会3D建模的菜鸟&#xff0c;只能到网上下载了&#xff0c;sketchfab就是一个不错的平台&#xff0c;有不少免费资源可以下载。 …...

Git 详解

Git 详解 Git 是一个分布式版本控制系统&#xff0c;用于高效地管理项目代码的版本历史。它是目前最流行的版本控制工具之一&#xff0c;广泛应用于软件开发领域。Git 的分布式架构允许开发者在本地进行代码的版本管理&#xff0c;并与远程仓库同步&#xff0c;实现团队协作。…...

Linux操作系统3-文件与IO操作1(从C语言IO操作到系统调用)

上篇文章&#xff1a;Linux操作系统2-进程控制3(进程替换&#xff0c;exec相关函数和系统调用)_execv系统调用-CSDN博客 本篇代码Gitee仓库&#xff1a;myLerningCode 橘子真甜/linux学习 - 码云 - 开源中国 (gitee.com) 本篇重点&#xff1a;C语言基础IO与系统调用 目录 一.…...

【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接

目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档&#xff1a;它可以将复杂的HTML或XML文本转换为易于操作的树形结构…...

Rancher V2.7.0安装教程

1、执行Docker命令 docker run -d --privileged --restartunless-stopped -p 80:80 -p 443:443 -v /home/rancher:/var/lib/rancher --name rancher registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.7.0 注&#xff1a;如果容器启动失败&#xff0c;参考我另外一篇文章…...

STM32MX 配置CANFD收发通讯

一、环境 MCU&#xff1a;STM32G0B1CEU6 CAN收发器&#xff1a;JIA1042 二、MX配置 配置SYS 配置canfd并开启中断&#xff0c;我开了两个FDCAN&#xff0c;配置是一样的&#xff0c;这里贴一下波特率的计算公式&#xff1a; 也就是&#xff1a;CAN时钟频率/预分频器/&…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...