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

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.rhkb.cn/news/261914.html

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

相关文章

Spring 类型转换、数值绑定与验证(一)— DataBinder

DataBinder 是Spring用于数据绑定、类型转换及验证的类。使用场景有&#xff1a;1&#xff09;xml配置文件定义bean,Spring 内部使用DataBinder 来完成属性的绑定&#xff1b;2&#xff09;Web请求参数绑定&#xff0c;在Spring MVC 中&#xff0c;Controller的方法参数通常会自…

MySQL数据库集群技术主从复制 一主一从详细讲解

集群技术 集群概述 MySQL复制技术 集群目的 负载均衡 解决高并发 高可用HA 服务可用性 远程灾备 数据有效性 类型 一主一从 一主双从 双主双从 原理 概念 在主库上把数据更改&#xff08;DDL DML DCL&#xff09;记录到二进制日志&#xff08;Binary Log&#xff09;中…

flink sql 实战实例 及延伸问题:聚合/数据倾斜/DAU/Hive流批一体 等

flink sql 实战实例 及延伸问题 Flink SQL 计算用户分布Flink SQL 计算 DAU多topic 数据更新mysql topic接入mysql引入 upsert-kafka-connector 以1.14.4版本为例 数据倾斜问题&#xff1a;让你使用用户心跳日志&#xff08;20s 上报一次&#xff09;计算同时在线用户、DAU 指标…

【LeetCode】递归精选8题——基础递归、链表递归

目录 基础递归问题&#xff1a; 1. 斐波那契数&#xff08;简单&#xff09; 1.1 递归求解 1.2 迭代求解 2. 爬楼梯&#xff08;简单&#xff09; 2.1 递归求解 2.2 迭代求解 3. 汉诺塔问题&#xff08;简单&#xff09; 3.1 递归求解 4. Pow(x, n)&#xff08;中等&…

机器人初识 —— 电机传动系统

一、背景 波士顿动力公司开发的机器人&#xff0c;其电机传动系统是其高性能和动态运动能力的核心部分。电机传动系统通常包括以下几个关键组件&#xff1a; 1. **电动马达**&#xff1a;波士顿动力的机器人采用了先进的电动马达作为主要的动力源&#xff0c;如伺服电机或步进…

【linux】shell命令 | Linux权限

目录 1. shell命令以及运行原理 2. Linux权限的概念 3. Linux权限管理 3.1 文件访问者的分类 3.2 文件类型和访问权限 3.3 文件权限值的表示方法 3.4 文件访问权限的相关设置方法 4. file指令 5. 目录的权限 6. 粘滞位 7. 关于权限的总结 1. shell命令以及运行原理 …

C++入门学习(三十二)二维数组定义方式

一维数组类似于一条“线”&#xff0c;而二维数组类似于一个“面”&#xff0c;二维数组也更像一个表格&#xff0c;由我们在“表格”中查询数据。 1、先定义数组&#xff0c;后赋值 int arr[2][3]; #include <iostream> using namespace std;int main() { int arr…

【2024软件测试面试必会技能】Jmeter_性能测试(5):负载测试和压力测试

负载测试 负载测试/容量测试&#xff1a;通过在测试过程中不断的调整负载&#xff0c;找到在多少用户量情况下&#xff0c;系统出现性能下降拐点&#xff1b;也被称为容量测试&#xff1b; 举例&#xff1a; 微信发送红包的负载测试&#xff1a; 1、找运维人员了解目前系统…

vue3中使用 tui-image-editor进行图片处理,并上传

效果图 下载包 pnpm i tui-image-editor pnpm i tui-color-picker调用组件 //html部分 <el-dialog v-model"imgshow" destroy-on-close width"40%" draggable align-center :show-close"true":close-on-click-modal"false">&l…

web安全学习笔记【13】——信息打点(3)

信息打点-JS架构&框架识别&泄漏提取&API接口枚举&FUZZ爬虫&插件项目[1] #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源…

【Web前端笔记10】CSS3新特性

10 CSS3新特性 &#xff11;、圆角 &#xff12;、阴影 &#xff08;&#xff11;&#xff09;盒阴影 &#xff13;、背景渐变 &#xff08;&#xff11;&#xff09;线性渐变&#xff08;主要掌握这种就可&#xff09; &#xff08;&#xff12;&#xff09;径向渐变 &…

HTTP与HTTPS-HTTPS 的应用数据是如何保证完整性的?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTPS 的应用数据是如何保证完整性的? TLS 在实现上分为握手协议和记录协议两层 TLS 握手协议就是我们前面说的 TLS 四次握手的过程&#xff0c;负责协商加密算法和生成对称密钥&#xff0c;后续用此密…

【Python】实现一个类似于Glass2k的Windows窗口透明化软件

一 背景说明 网上看到一款Windows下的窗口透明化工具Glass2k&#xff08;Glass2k官网&#xff09;&#xff0c;可以简单地通过快捷键实现任意窗口的透明化&#xff0c;还挺方便的&#xff0c;想用Python自己实现一下类似的功能。 软件已经开源到&#xff1a;窗口透明化小工具开…

Java 面向对象进阶 14 抽象类和抽象方法(黑马)

抽象类不能实例化&#xff08;创建对象&#xff09;&#xff1a; 抽象类中不一定有抽象方法&#xff1a; 有抽象方法的类一定是抽象类&#xff1a; 可以有构造方法&#xff1a;&#xff08;作用&#xff1a;在创建子类对象时&#xff0c;给属性进行赋值的&#xff09; Perso…

RabbitMQ保证消息的可靠性

1. 问题引入 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送时丢失&#xff1a; 生产者发送的消息未送达exchange消息到达exchange后未到达queue MQ宕机&…

C++ Webserver从零开始:配置环境(九)——下载github的项目进行测试

前言 大家好&#xff0c;我又来更新Webserver的博客了。上一次更新这个专栏时2024.2.5号&#xff0c;离现在已经13天了。非常抱歉&#xff0c;中间隔了那么久。一方面是基础知识学完之后&#xff0c;就要开始自己写代码了。看基础知识和写代码是两回事&#xff0c;理论和实践的…

Git常用命令整理

在介绍安装和简单使用前&#xff0c;先看一下百度百科中的简介吧&#xff1a; ———————————————————————————————————————— Git --- The stupid content tracker, 傻瓜内容跟踪器。 Linux 是这样给我们介绍 Git 的&#xff1a; Git 是用…

Kafka进阶

文章目录 概要应用场景消息队列两种模式kafka的基础架构分区常见问题小结 概要 kafka的传统定义&#xff1a;kafka是一个分布式的基于发布\订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。 kafka的最新概念&#xff1a;kafka是一个开源的分布式事件流平台&#x…

UIKit 在 UICollectionView 中拖放交换 Cell 视图的极简实现

概览 UIKit 中的 UICollectionView 视图是我们显示多列集合数据的不二选择&#xff0c;而丰富多彩的交互操作更是我们选择 UICollectionView 视图的另一个重要原因。 如上图所示&#xff1a;我们实现了在 UICollectionView 中拖放交换任意两个 Cell 子视图的功能&#xff0c;这…

不要抱怨,不如抱 Java 运算符吧 (1)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…