算法——二分查找(day9)

704.二分查找

704. 二分查找 - 力扣(LeetCode)

题目解析:

这道题其实用暴力其实很简单,挨个对比就完事了~

但我们可以利用其升序的特性对其进行优化:

随机选择一个数(5),发现比目标值(9)小那么这就意味着红线所画的部分全部都不用考虑了,5前面只会是比它还小的数,而利用该特性我们排除一个数的时候可以顺带排除另外一匹数。

算法解析:

我们设置一个变量mid,尽量让它指向中间部分。然后我们再根据题意把数组划分为两个区间,一个为符合区间,另一个为不符合区间。二分的本质就是不断舍弃不符合区间,然后在符合区间内进行再次划分为2区间,直到找到目标数为止。

代码:

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;//循环持续到双指针指向同一个数为止while (left <= right){//避免溢出的另一种取中写法int mid = left + (right - left) / 2;if (nums[mid] < target){left = mid + 1;}else if (nums[mid] > target){right = mid - 1;}else{return mid;}}return -1;}
};

 

34. 在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

题目解析:

本题会发现无法像上一题那样用二分查找,因为该题是要返回重复数字的起始与终点位置,所以我们尝试把这个过程给拆分开来,先求左区间端点,再求右区间端点。

算法解析:

既然是找左端点,那肯定得保证从左边开始的数是能够划分在一起的。所以我们规定两个区间,一个区间内都是小于t的数,另一个区间都是大于等于t的数。

  • 当我们所挑选的mid落入小于t的区间时,由于是没有结果的区间,只要让left跳出该区间即可。
  • 当我们所挑选的mid落入大于等于t的区间时,由于是有结果的区间,right只需要跟紧mid即可。

循环细节处理:

当mid落入条件2时,left与right会是同一指向。但这个题无法在相等时候立刻返回结果,因为要返回两个范围。所以如果left与right相等那就会重新进入循环一直达成条件2,造成死循环。

所以真正的循环条件应该是:left<right

中点细节处理:

如果mid为第二种取法,那么当mid落入条件2时,right会留在原地并且循环仍会继续,就这样一直落入条件2,造成死循环。

所以正确的中点取法应该为:mid = left+(right-left)/2

当我们要求右端点时,那就得保证到右边截止都有一段连续的数。

  • 当mid落入小于等于t的区间内时,由于是有结果的区间,left跟紧mid即可。
  • 当mid落入大于t的区间内时,由于是没有结果的区间,right跳出区间即可。

中点细节处理:

当中点取法选择第一种时,会让mid落入条件2,left留在原地。这样会一直进入循环使得mid一直处于条件2中,造成死循环。

 所以正确的中点取法应该为:mid = left+(right-left+1)/2

代码:

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> ret;//特殊情况判断if (nums.size() == 0){return { -1,-1 };}int left = 0, right = nums.size() - 1;//求左区间端点//注意循环条件while (left < right){//注意中点取法int mid = left + (right - left) / 2;if (nums[mid] < target){left = mid + 1;}else{right = mid;}}if (nums[right] != target){return { -1,-1 };}//加入起始点else {ret.push_back(right);}//范围重置left = 0;right = nums.size() - 1;//求右区端点while (left < right){//注意中点取法int mid = left + (right - left + 1) / 2;if (nums[mid] <= target){left = mid;}else {right = mid - 1;}}//加入结尾点ret.push_back(left);return ret;}
};

 

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

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

相关文章

38.综合练习:评委打分

需求&#xff1a;有6位评委打分&#xff0c;分数范围[0&#xff0c;100]&#xff0c;去掉一个最高分和最低分之后&#xff0c;剩下4个评委的平均分就是最终得分 import java.util.Scanner;public class 评委打分 {public static void main(String[] args) {int[] arr new int…

给Windows系统中注入服务,即windwos守护进程

最近总是在windwos环境下测试nginx&#xff0c;总是需要频繁重启nginx服务。于是考虑有没有可能把nginx加入到系统服务的操作。在网上找了一大堆资料&#xff0c;现在来总结一下&#xff01; 方法1&#xff1a;利用nssm工具实现 这是一个守护进程的软件&#xff0c;可以在win…

利用‘WPS表格’或Excel批量修改文件名

以这些压缩包文件为例 第一步&#xff1a;新建一个空白的表格文档&#xff0c;并打开 第二步&#xff1a;对表格进行以下形式的设置 第三步&#xff1a;CtrlA(全选)–>按 Ctrlshift 的同时在空处点击鼠标右键–>复制文件地址&#xff1b;并填充对应的表格的单元格 第…

初识c++:string类(2)

#本节主要讲解c&#xff1a;string类的模拟实现 全部代码的实现在最后面&#xff01;&#xff01;&#xff01;有需要的自己往下滑&#xff0c;自取&#xff01;&#xff01;&#xff01;1.string类的模拟实现 2.浅拷贝 3.深拷贝 目录 #本节主要讲解c&#xff1a;string类…

洛谷 P9854 [CCC 2008 J1] Body Mass Index

这题让我们计算出 BMI 值&#xff0c;随后判断属于哪个等级。 BMI 值计算公式&#xff1a; ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​。 BMI 范围 对应信息 …

Linux NFS服务搭建及使用

一、NFS 服务器介绍 nfs &#xff08; Network File System &#xff09;即网络文件系统&#xff0c;其基于 UDP/IP使用 nfs 能够在不同计算机之间通过网络进行文件共享&#xff0c;能使使用者访问网络上其它计算机中的文件就像在访问自己的计算机一样。 二、NFS 服务器的特点 …

关闭Xshell后,任务将结束-tmux

Xshell标签中的会话结束后&#xff0c;会话中运行的进程也将被结束。 关闭标签 解释&#xff1a; xshell在断开连接后会中止所有正在运行的进程和任务&#xff0c;因为xshell客户端是通过ssh协议连接到远程服务器的&#xff0c;一旦连接断开&#xff0c;所有与该会话相关的进程…

[渗透测试] 主动信息收集

主动信息收集 在红蓝对抗过程中&#xff0c;资产属于核心地位&#xff0c;攻击方&#xff08;红方&#xff09;要尽可能的去获取对方资产&#xff0c;暴露目标资产&#xff0c;包括IP地址、网络设备、安全设备、服务器、存储在服务器中的数据等。防守方也要清楚自己有多少有价…

新榜矩阵通 | 家居行业品牌矩阵运营评估报告

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 新榜矩阵通推出“品牌矩阵运营评估”系列报告&#xff0c;深入剖析不同行业在新媒体平台上的运营策略及成效&#xff0c;为企业提供一个清晰标准的行业矩阵发展“参考坐标”。 随着自然流量匮乏、行业竞争…

免费【2024】springboot 博物馆展览与服务一体化平台

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

传知代码-智慧医疗:纹理特征VS卷积特征(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 论文链接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1076633223003537?__cf_chl_rt_tkJ9Aipfxyk5d.leu48P20ePFNd4B2aunaSmzVpXCg.7g-1721292386-0.0.1.1-6249 论文概述 今天我们把视线…

第8集《大佛顶首楞严经》

请大家打开《讲义》第十六页。 辛四、破转计见内。分二&#xff1a;壬一、转计。壬二、破斥。 古德说&#xff1a;不识本心&#xff0c;修法无益。我们的法门有很多选择&#xff0c;你可以去拜佛&#xff0c;你可以去念佛&#xff0c;你可以去持咒。但是从《楞严经》的角度来…

mac如何清理dns缓存 macbook清除dns缓存命令 苹果清理内存软件 为什么需要清除DNS缓存数据

在Mac操作系统中&#xff0c;清除DNS缓存可以帮助解决一些与域名解析有关的问题&#xff0c;例如访问速度慢、网站无法打开等。当遇到网络无法访问互联网等故障时有些用户不知道怎么清理DNS缓存&#xff0c;不清楚苹果mac清理内存怎么清理。接下来就给大家介绍一下Mac电脑清理d…

游泳耳机品牌哪个牌子好?四大高热度游泳耳机综合分析

近年来&#xff0c;游泳耳机的受欢迎程度呈指数级增长&#xff0c;市场热度不断攀升。但作为一名长期关注运动科技的专业人士&#xff0c;我必须提醒大家&#xff0c;在享受水下音乐的同时&#xff0c;也要注意选择专业可靠的产品。市面上许多所谓的“游泳耳机”其实缺乏必要的…

力扣 27移除元素

思路&#xff1a; 题目需要在原数组的基础上&#xff0c;移除等于val的元素&#xff0c;并返回数组移除后的元素数 用双指针遍历&#xff0c;for循环遍历&#xff0c;fast先行 如果当前元素等于val&#xff0c;fast自增是写在for循环中的,slow不变 如果不等&#xff0c;fas…

《Java初阶数据结构》----6.<优先级队列之PriorityQueue底层:堆>

前言 大家好&#xff0c;我目前在学习java。之前也学了一段时间&#xff0c;但是没有发布博客。时间过的真的很快。我会利用好这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

08 capture软件新建原理图 09 原理图添加元器件 10 原理图信号连通 11 原理图电源和地连通

08 capture软件新建原理图 && 09 原理图添加元器件 && 10 原理图信号连通 && 11 原理图电源和地连通 第一部分 08 capture软件新建原理图第二部分 09 原理图添加元器件第三部分 10 原理图信号连通第四部分 11 原理图电源和地连通 第一部分 08 capture软…

C#---23:Virtual、abstract、Interface的区别 混合使用的案例

文章目录 1. virtual & abstract & interface 的区别(1)virtual 修饰的方法(2)abstract修饰的方法(3)interface修饰的方法 2. 一个class继承多个interface 的应用3. 一个class继承一个class和多个interface4. abstract作为中间介质&#xff08;将不同的人以及不同的坦克…

备份软件维护之NETBACKUP NBU知多少

一、基本介绍 NetBackup (NBU) 是一款企业级的数据备份和恢复软件&#xff0c;‌由Symantec公司开发&#xff0c;‌旨在为异构平台提供全面的数据保护。‌ 它支持从远程办公室到数据中心的各种环境&#xff0c;‌包括UNIX、‌Windows、‌Linux和NetWare等操作系统&#xff0c;…

算法-KMP字符串匹配

题目一 解题思路 KMP算法详解 详解next数组 next[i] 就是使子串 s[0…i] 有最长相等前后缀的前缀的最后一位的下标。 总体来说解next数组和模板串匹配的过程很相似&#xff0c;触类旁通 代码模板 #include<iostream> using namespace std; const int N1e510; char …