【数据结构刷题专题】—— 二分查找

二分查找

二分查找模板题:704. 二分查找
二分查找前提:

  • 有序数组
  • 数组中无重复元素

左闭右闭:

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) {right = mid - 1;} else if (nums[mid] < target) {left = mid + 1;} else return mid;}return -1;}
};

左闭右开

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

时间复杂度: O ( l o g n ) O(logn) O(logn)
空间复杂度: O ( 1 ) O(1) O(1)
二分查找拓展题:
【1】35.搜索插入位置
在这里插入图片描述
有两种情况考虑:

  1. 在数组中:二分查找
  2. 不在数组中:
  • 所有数之前
  • 在某两数之间
  • 在所有数之后

而不在数组中即在二分查找的基础上改变退出循环后返回的值
二分查找退出循环时,左闭右闭left=right+1,左闭右开left=right

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

时间复杂度: O ( l o g n ) O(logn) O(logn)
空间复杂度: O ( 1 ) O(1) O(1)

【2】69. x 的平方根

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

【3】367. 有效的完全平方数

class Solution {
public:bool isPerfectSquare(int num) {int left = 0; int right = num;while (left <= right) {int mid = (left + right) / 2;if ((long long)mid * mid > num) right = mid - 1;else if ((long long)mid * mid < num) left = mid + 1;else return true;}return false;} 
};

【4】34. 在排序数组中查找元素的第一个和最后一个位置
两次二分,定义新变量first、last

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

【5】74. 搜索二维矩阵
二维转一维

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size();int n = matrix[0].size();int left = 0;int right = m * n - 1;while (left <= right) {int mid = (left + right) / 2;int x = matrix[mid / n][mid % n];if (x > target) right = mid - 1;else if (x < target) left = mid + 1;else return true;}return false;}
};

【6】33. 搜索旋转排序数组
通过二分找到旋转点,在区间内部二分找到目标值
在这里插入图片描述

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

【7】153. 寻找旋转排序数组中的最小值

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

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

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

相关文章

基于unbantu的nginx的配置

目录 前言: 1.安装nginx并进行测试 1.1使用nginx -v 命令查看版本 1.2开启服务 查看端口 1.3测试 2.nginx的静态资源访问配置 2.1创建静态资源存放的目录 2.2写入目录中测试文件对应的内容 2.3修改配置文件 2.4 测试 3.虚拟主机配置 3.1创建目录 3.2写入测试…

SOLIDWORKS 2024 推荐硬件:开箱即用的配置以及升级优化的SOLIDWORKS硬件

SOLIDWORKS 2024已于2023年年末发布&#xff0c;使用SOLIDWORKS 2024的用户关注的问题之一就是&#xff1a;适合SOLIDWORKS2024这个版本的最佳硬件是什么&#xff1f; 这篇文章&#xff0c;硕迪科技将推荐SOLIDWORKS 2024的开箱即用的解决方案以及各个硬件的配置要求。 这些建议…

JavaEE 初阶篇-深入了解多线程等待与多线程状态

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 线程等待 1.1 线程等待 - join() 方法 1.1.1 main 线程中等待多个线程 1.1.2 main 线程等待 t2 线程且t2 线程等待 t1 线程 1.1.3 其他线程阻塞等待 main 线程 1.…

机器学习概论—增强学习

机器学习概论—增强学习 强化学习(Reinforcement Learning, RL)或者说是增强学习,是机器学习的一个领域,旨在使智能体通过与环境的交互学习如何做出决策,它是关于在特定情况下采取适当的行动来最大化奖励。它被各种软件和机器用来寻找在特定情况下应采取的最佳行为或路径…

在.Net6中用gdal实现第一个功能

目录 一、创建.NET6的控制台应用程序 二、加载Gdal插件 三、编写程序 一、创建.NET6的控制台应用程序 二、加载Gdal插件 Gdal的资源可以经过NuGet包引入。右键单击项目名称&#xff0c;然后选择 "Manage NuGet Packages"&#xff08;管理 NuGet 包&#xff09;。N…

视频素材免费哪个好?7个视频素材下载网站推荐

小伙帮们准备做视频的时候才发现&#xff0c;哎呀&#xff0c;高清视频素材哪里找啊&#xff1f;不用急&#xff0c;这次我们依旧从中国的宝藏网站开始&#xff0c;然后穿越全球&#xff0c;发现更多精彩的无水印视频素材网站 1&#xff0c;蛙学府&#xff08;中国&#xff09…

辅助驾驶-ACC

自适应巡航&#xff08;ACC&#xff09;使汽车能够自动调整自身速度与前车保持安全的行驶距离。 从整车系统层面考虑&#xff0c; ACC 是一个多种控制单元联合参与才能实现的功能。在这个系统中&#xff0c;雷达或者摄像头除了作为传感器提供目标车信息&#xff0c;核心的 ACC …

Postman中参数填写方式!

Postman中参数填写和请求方法有关&#xff0c;一般接口用例请求方法GET与POST常用&#xff0c;所以主要是这两种请求方法请求参数填写 一、GET请求方法参数填写 1、直接在URL中填写请求参数,如直接在URL中填写&#xff1a; http://www.example.com:8089/userapi?unamelisi&…

蓝桥杯练习题 近似GCD 双指针

题目 小蓝有一个长度为 n 的数组 4 (a1, a2,,an),数组的了数组被定义为从 原数组中选出连续的一个或多个元素组成的数组。数组的最大公约数指的是数 组中所有元素的最大公约数。 如果最多更改数组中的一个元素之后,数组的最大公约数为 g,那么称 g 为这个数组的近似GCD。 一个数…

大数据做「AI大模型」数据清洗调优基础篇

关于本文 近期一直在协助做AI大模型数据清洗调优的工作&#xff0c;主要就是使用大数据计算引擎Spark做一些原始数据的清洗工作&#xff0c;整体数据量大约6PB-8PB之间&#xff0c;那么对于整个大数据量的处理性能将是一个重大的挑战&#xff0c;关于具体的调优参数配置项暂时不…

13-API风格(下):RPCAPI介绍

RPC在Go项目开发中用得也非常多&#xff0c;需要我们认真掌握。 RPC介绍 根据维基百科的定义&#xff0c;RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;即远程过程调用&#xff0c;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机…

1.5-数组-059. 螺旋矩阵 II★★

59. 螺旋矩阵II ★★ 力扣题目链接&#xff0c;给你一个正整数 n &#xff0c;生成一个包含 1 到 n 2 n^2 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。1 < n < 20 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,…

mp4转rmvb怎么转?超快的方法分享!

RMVB&#xff08;RealMediaVariableBitrate&#xff09;是由RealNetworks公司推出的一种视频文件格式。相较于其他视频格式&#xff0c;RMVB以其高度压缩和可变比特率的特性而著称。它常被用于网络视频传输&#xff0c;适用于带宽有限或网络环境较差的情况。 RMVB文件格式的特性…

arp 协议

数据链路层 我们之前学习到的 IP 协议解决的是数据跨网络传输的问题。 数据链路层解决的是&#xff1a;直接相连的主机&#xff0c;进行数据交付的问题&#xff01; 直接相连的设备包括我们的电脑&#xff0c;路由器等等哈&#xff01; 我们在网络基础那篇文章中讲过什么是以…

音频怎么转换成二维码?1分钟在线生成音频二维码

音频是现在很常见一种内容展现方式&#xff0c;很多人会通过音频文件来做推广传播&#xff0c;在很多的应用场景中&#xff0c;音频用来为用户提供内容&#xff0c;从而提升用户体验效果。 为了方便用户能够快速的获取音频文件&#xff0c;通过将音频生成二维码之后&#xff0…

基于单片机的便携式瓦斯检测仪系统设计

**单片机设计介绍&#xff0c;基于单片机的便携式瓦斯检测仪系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的便携式瓦斯检测仪系统设计是一个针对煤矿等工业环境中瓦斯气体浓度检测的重要项目。以下是该设计…

【单调栈】力扣84.柱状图中最大的矩形

上篇文章我们介绍了使用 无重复值 单调栈代码解决 含有重复值 的问题&#xff0c;在文章的最后&#xff0c;留下了一道考察相同思想的题目&#xff0c;今天我们来看看如何套路解决该题。 &#xff08;还没看过前几篇介绍的小伙伴赶快关注&#xff0c;在 「单调栈」 集合里查看…

启信宝商业大数据助力全国经济普查

近日&#xff0c;合合信息旗下启信宝收到中国青年创业就业基金会感谢信&#xff0c;对启信宝协同助力全国经济普查和服务青年创业就业研究表达感谢。 第五次全国经济普查是新时代新征程上一次重大国情国力调查&#xff0c;是对国民经济“全面体检”和“集中盘点”&#xff0c;…

2024年最受欢迎的视频号小店,怎么做才能月入过万?两步教会你

大家好&#xff0c;我是电商花花。 要说现在最火的项目&#xff0c;我觉得是视频号小店&#xff0c;现在视频号小店经过两年时间的沉淀&#xff0c;让更多人看到了视频号强大私域转化和高利润空间。 抖音小店我们应该也都知道&#xff0c;现在现在的抖音小店利润是不是变小了…

ESCTF-密码赛题WP

*小学生的爱情* Base64解码获得flag *中学生的爱情* 社会主义核心价值观在线解码得到flag http://www.atoolbox.net/Tool.php?Id850 *高中生的爱情* U2FsdG开头为rabbit密码,又提示你密钥为love。本地toolfx密码工具箱解密。不知道为什么在线解密不行。 *大学生的爱情* …