力扣基础刷题---二分查找

704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

中心思想:找到中间值,跟中间值比较,如果比中间的大,就在后半部分;如果比中间的小,就在前半部分;如果相等即为所求。当遍历到最后,还不存在,则说明不存在。

方法一:左闭右闭区间( right=nums.size()-1;)

target 是在一个在左闭右闭的区间里,也就是[left, right] ,在这个情况下,while要包含left==right的情况。

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

方法二:左闭右开区间( right=nums.size();)

  • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
class Solution {
public:int search(vector<int>& nums, int target) {int left=0;int right=nums.size();if(right<=left) return -1;while(left<right){int mid=(right+left)/2;if(nums[mid]==target)   return mid; else if(nums[mid]<target) left=mid+1;else right=mid;   }return -1;}
};

374. 猜数字大小

这道题读懂题目即可。其实和上面一模一样

需要注意:

  • 1 <= n <= 2^{31} - 1
  • 2n其实超出了int的范围,所以需要把left、right、mid设置为long 类型
class Solution {
public:int guessNumber(int n) {//左闭右闭区间long left=1;long right=n;long mid;while(left<=right){mid=(left+right)/2;if(guess(mid)>0)// pick > numleft=mid+1;else if(guess(mid)==0) break;else right=mid-1;}return mid;}
};

35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 

时间复杂度为 O(log n) 的算法。-----》二分算法

返回按顺序插入的位置,其实就是二分查找的时候,left所在的点。

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

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

两个方法:简单点想其实就是找到所有与target相等的值,最小的就是第一个,最大的就是最后一个。全部找出来,复杂度有点高。

方法一:那不妨想,第一个实际上就是不断向前找;最后一个就是不断向前找。可以分为两次查找 

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {if(!nums.size()) return {-1,-1};int first=-1;int last=-1;int mid;int left=0;int right=nums.size()-1;//找firstwhile(left<=right){mid=(left+right)/2;if(nums[mid]==target) {first=mid;right=mid-1;//不断向前找}else if(nums[mid]>target) right=mid-1;else left=mid+1;}//找lastleft=0; right=nums.size()-1;while(left<=right){mid=(left+right)/2;if(nums[mid]==target) {last=mid;left=mid+1;//不断向后找}else if(nums[mid]>target) right=mid-1;else left=mid+1;}return {first,last};}
};

方法二:看上面的代码,其实大部分代码都是相同的逻辑,我们不防精简一下:

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1;vector<int> ret {-1, -1};while(l <= r){int mid = (l + r) / 2;if(nums[mid] > target){r = mid - 1;}else if (nums[mid] < target){l = mid + 1;}else{l = r = mid;while(--l >= 0 && nums[l] == target){;}while(++r < nums.size() &&nums[r] == target){;}ret[0] = l + 1;ret[1] = r - 1;return ret;}}return ret;}
};

这个就是找到中间那个相等的值之后,不断像前,向后逼近。(一次二分)

                while(--l >= 0 && nums[l] == target){;}while(++r < nums.size() &&nums[r] == target){;}ret[0] = l + 1;ret[1] = r - 1;

167. 两数之和 II - 输入有序数组

双指针+空间缩减(题解推荐:167. 两数之和 II - 输入有序数组 - 力扣(LeetCode))

同样这里注意审题,返回的下标

class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {//双指针+缩减空间int row=0;int col=numbers.size()-1;while(row<col){int sum=numbers[row]+numbers[col];if(sum>target){col--;}else if(sum<target) row++;else return vector<int>{row+1,col+1};}return vector<int>{-1,-1};}
};

拓展一下:返回二维数组的情况还可以直接返回

{row+1,col+1};

或者利用veror动态数组的内置函数

        vector<int> res;res.push_back(low+1);res.push_back(high+1);return res;

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

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

相关文章

2024.2.23

1、消息队列代码 msgsnd.c #include<myhead.h> //定义一个消息类型 struct msgbuf {long mtype; //消息类型char mtext[1024]; //消息正文 };//定义一个宏&#xff0c;表示消息正文大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int …

Docker容器故障排查与解决方案

Docker是一种相对使用较简单的容器&#xff0c;我们可以通过以下几种方式获取信息&#xff1a; 1、通过docker run执行命令&#xff0c;或许返回信息 2、通过docker logs 去获取日志&#xff0c;做有针对性的筛选 3、通过systemctl status docker查看docker服务状态 4、通过…

数据安全治理实践路线(上)

基于以上数据安全治理实践理念&#xff0c;可以按照自顶向下和自底向上相结合的思路推进实践过程。一方面&#xff0c;组织自顶向下,以数据安全战略规划为指导,以规划、建设、运营、优化为主线&#xff0c;围绕构建数据安全治理体系这一核心&#xff0c;从组织架构、制度流程、…

“从根到叶:深入理解排序数据结构“

一.排序的概念及引用 1.1排序的概念 排序是指将一组数据按照一定的规则重新排列的过程。排序的目的是为了使数据具有有序性&#xff0c;便于查找、插入、删除等操作&#xff0c;提高数据的组织和管理效率。 稳定性是指如果序列中存在相等元素&#xff0c;在排序完成后&#…

网卡本质,网络发展(局域网,广域网概念)

目录 引入 网卡的本质 网络的发展 引入 早期 局域网LAN&#xff08;Local Area Network&#xff09; 广域网WAN&#xff08;Wide Area Network&#xff09; 注意 引入 前面我们已经学习了很多关于linux系统的知识,其中文件系统和线程尤为繁杂 而网络其实也算系统的一部…

2024年开发者的最好选择!!没有之一

中国银河证券1月23日明确指出&#xff1a;鸿蒙应用将在2024年迎来爆发。 2024年Q2推出开发者Beta版&#xff0c;2024年Q4推出商用版。今年年终将有 5000 款应用完成原生鸿蒙开发&#xff0c;未来支持 50 万款应用。覆盖便捷生活、出行文旅、金融便利、社交资讯、生产力工具、影…

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024)

2024能源动力、机械自动化与航天航空技术国际学术会议(ICEPMAT2024) 会议简介 能源动力、机械自动化和航空航天技术国际学术会议&#xff08;ICEPMAT2024&#xff09;将于2024年在北京举行。会议将探讨能源动力、机械自动化、航空航天技术领域的新研究热点、核心技术和发展趋…

【Git】:远程仓库操作

远程仓库操作 一.理解版本控制系统二.远程仓库1.克隆2.Push操作3.fetch操作4. .gitnore文件 一.理解版本控制系统 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的笔记本或者计…

Camtasia Studio2024破解版屏幕录像和视频编辑软件

Camtasia Studio是一款专业的屏幕录像和视频编辑软件&#xff0c;它可以用来进行多种工作&#xff1a; 屏幕录制&#xff1a;Camtasia Studio可以录制电脑屏幕上的任何活动&#xff0c;如软件操作、演示、游戏过程等&#xff0c;非常适合制作教学视频、软件教程、游戏解说等。…

京东前端笔试(附答案解答)

引言 我目前本科大四&#xff0c;正在春招找前端&#xff0c;有大厂内推的友友可以聊一聊&#xff0c;球球给孩子的机会吧。 我整理了一份10w字的前端技术文档&#xff1a;https://qx8wba2yxsl.feishu.cn/docx/Vb5Zdq7CGoPAsZxMLztc53E1n0k?fromfrom_copylink &#xff0c;对…

什么是汽车抛负载Load dump

1.什么是抛负载 抛负载&#xff0c;英文为Load dump&#xff0c;是指断开电源与负载的瞬间&#xff0c;由于负载突变而引起电源电压急剧变化。在汽车电子领域&#xff0c;抛负载是指在蓄电池充电时&#xff0c;断开发电机与蓄电池的连接而引起发电机输出大电压尖峰&#xff0c…

【Linux】一站式教会:Ubuntu(无UI界面)使用apache-jmeter进行压测

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、Java…

EventStream获得数据流,前端配置获得推送的流

如上图所示&#xff0c;请求一个接口&#xff0c;接口以数据流的方式向客户端推送数据&#xff0c;默认需要消息收集一条&#xff0c;在原来的基础上追加&#xff0c;在create-react-app生成的工程中&#xff0c;如果代理使用了中间件http-proxy-middleware&#xff0c;同时dev…

数据库面试题汇总,助你轻松应对面试!

考虑到最近有些小伙伴准备跳槽&#xff0c;所以更新一些数据库相关的面试题&#xff0c;希望能帮到大家&#xff01; 一 请写出创建表的基本语法结构&#xff1f; 创建表的基本语法结构如下&#xff1a; CREATE TABLE IF NOT EXISTS 表名(字段名1 字段类型,字段名2 字段类型 …

在springboot中调用openai Api并实现流式响应

之前在《在springboot项目中调用openai API及我遇到的问题》这篇博客中&#xff0c;我实现了在springboot中调用openai接口&#xff0c;但是在这里的返回的信息是一次性全部返回的&#xff0c;如果返回的文字比较多&#xff0c;我们可能需要等很久。 所以需要考虑将请求接口响应…

QT_day4

1.思维导图 2. 输入闹钟时间格式是小时:分钟 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);id startTimer(1000);flag1;speecher new QTextT…

nginx 配置文件详细介绍

一&#xff0c; nginx 配置文件架构 上一篇 已对 main 全局配置做了详细介绍 本章对剩下的配置文件部分做介绍 二&#xff0c;event 设置 &#xff08;一&#xff09;event 相关的配置文件为 配置工作模式以及连接数 &#xff08;二&#xff09;具体表现 1&#xff…

c语言经典测试题3

1.题1 int a 248, b 4; int const *c 21; const int *d &a; int *const e &b; int const * const f &a; 请问下列表达式哪些会被编译器禁止&#xff1f; A: *c 32; B: *d 43 C: e&a D: f0x321f 我们来分析一下&#xff1a;const用来修饰变量是想其…

鸿蒙自定义侧滑菜单布局(DrawerLayout)

前言 为了实现安卓中的侧滑菜单布局效果&#xff0c;通过查找鸿蒙的布局控件&#xff0c;发现SideBarContainer控件有点像&#xff0c;但是使用中发现并不是很符合我们的UI交互效果&#xff0c;因此我在鸿蒙中通过自定义布局的方式实现&#xff0c;本文主要介绍该自定义控件如…

kubernetes负载均衡部署

目录 1.新master节点的搭建 对master02进行初始化配置&#xff08;192.168.88.31&#xff09; 将master01的配置移植到master02 修改master02配置文件 2.负载均衡的部署 两台负载均衡器配置nginx 部署keepalived服务 所有node节点操作 总结 实验准备&#xff1a; k8s…