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

二分查找

二分查找模板题: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://www.mzph.cn/news/779104.shtml

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

相关文章

python基础知识3——列表和元组

python基础知识学习笔记之常用数据类型操作 1、列表 1.1、列表的概念和定义 概念&#xff1a;列表是有序的可变的元素集合。 定义&#xff1a; 方式1&#xff1a;[ 元素1, 元素2…] names ["zhangsan", "lisi", "wangwu"] print(names, type…

网络爬虫框架Scrapy的入门使用

Scrapy的入门使用 Scrapy概述引擎&#xff08;Engine&#xff09;调度器&#xff08;Scheduler&#xff09;下载器&#xff08;Downloader&#xff09;SpiderItem Pipeline 基本使用安装scrapy创建项目定义Item数据模型对象创建爬虫(Spider)管道pipeline来保存数据启动爬虫 其他…

消费盲返:新型返利模式引领购物新潮流

消费盲返&#xff0c;一种引领潮流的新型消费返利模式&#xff0c;其核心在于&#xff1a;消费者在平台选购商品后&#xff0c;不仅能享受优惠价格&#xff0c;更有机会获得后续订单的部分利润作为额外奖励。这种创新的返利机制&#xff0c;既提升了消费者的购物体验&#xff0…

AUTOSAR关于内存栈的分层及描述

首先关于关于内存栈的分层&#xff1a;如下图所示&#xff0c;Nvm靠近RTE的&#xff1b;MemIf居中&#xff0c;EA和FEE被包含其中。 其次关于这三层的缩写&#xff1a;可以看到EEPROM的模拟和EEPROM的抽象层。 我们可以看到 大概的数据流&#xff1a; 和大致的结构分层作用&am…

使用argocd作为cd流程

一、前言 讲述关于argocd在cicd流程中的使用&#xff0c;ci这里使用gitlabjenkins流水线的方式&#xff0c;jenkins用于拉代码打包、构建镜像、变更yaml文件的镜像、推送变更的yaml文件到gitlab的gitops仓库中&#xff0c;最后再有argocd实现cd流程&#xff0c; 二、使用 关于…

​网络安全相关证书资料​——OSCP、CISP-PTE

网络安全相关证书有哪些&#xff1f;——就实战型看&#xff0c;OSCP、CISP-PTE &#xff08;国家注册渗透测试工程师&#xff09;最好。 网络安全相关证书有哪些&#xff1f; 网络安全相关证书有哪些呢&#xff1f;了解一下&#xff01; 1. CISP &#xff08;国家注册信息安全…

全国产数据采集卡定制,24位八通道以太网数据采集卡 labview 100K采样

XM702是一款以太网型高速数据采集卡&#xff0c;具有8通 道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率100ksps八通 道同步共计800ksps、精密前置增益放大、集成IEPE/ICP硬件 支持的特点。本产品采用了多个高精度24位ADC单元及配合本 公司多年积累开发的前置…

WinSock Api connect超时函数实现方法

当调用listen(serverSocket, 1)时&#xff0c;1表示服务器同时处理的连接请求的最大数量。在这种情况下&#xff0c;服务器只能处理一个客户端连接请求。如果客户端尝试连接时&#xff0c;服务器正在处理一个连接请求&#xff0c;客户端将被阻塞&#xff08;即死等&#xff09;…

性能小钢炮,美学艺术品!佰维PD2000移动固态硬盘新品即将上市

开春时节&#xff0c;想必大家已经准备踏上春游旅程。每到一个景点&#xff0c;或许总想记录精彩的瞬间&#xff0c;留存优美的景色。但由于手机存储容量有限&#xff0c;很多时候我们拍不了多少照片&#xff0c;手机就开始提示存储空间不足。而iCloud昂贵的云存储价格也让人望…

linux生产桌面程序并实现开机自启动

1.生产桌面程序 编写桌面文件脚本 创建一个桌面脚本文件&#xff0c;后缀名为desktop&#xff0c;我的为my.desktop,文件内容如下 [Desktop Entry] Version1.0 Namemy Comment this app use for ljs Exec/home/ljs/myTestApp Icon/home/ljs/icon.png Terminalfal…

2023年后端面试总结

备注&#xff1a;这篇文章是我在2023年年初在自己的网站上写的&#xff0c;最近在迁移技术文章&#xff0c;我感觉这个也是和咱程序员相关&#xff0c;所以今天就决定把它迁移过来。 .......................................................................分割线..........…

机器学习概论—增强学习

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

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

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

docker logs 查找日志常用命令

docker logs 是什么 docker logs 是 Docker 命令行工具提供的一个命令&#xff0c;用于查看容器的日志输出。它可以显示容器在运行过程中生成的标准输出&#xff08;stdout&#xff09;和标准错误输出&#xff08;stderr&#xff09;&#xff0c;帮助用户诊断容器的行为和排查…

Python的面向对象、封装、继承、多态相关的定义,用法,意义

面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用对象的概念来模拟现实世界的实体&#xff0c;并通过类&#xff08;Class&#xff09;来创建这些实体的蓝图。OOP的核心概念包括封装、继承和多态。 Python中的面向对象编程 在Python中&#xff0c;一…

2024年妈妈杯数学建模思路A题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

课堂练习:环境体验——Linux 文件操作命令

任务描述 第二个任务就是了解Linxu的文件查看命令&#xff0c;文件编辑基本命令。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.文件查看命令。 2.文件编辑基本命令。 文件查看命令 我们要查看一些文本文件的内容时&#xff0c;要使用文本编辑器来查看…

使用OpenSSL指令测试椭圆曲线签名算法ECDSA

文章目录 小结问题及解决获取secp256r1的公钥和私钥DER格式使用OpenSSL及secp256r1算法获得签名使用OpenSSL及secp256r1算法对签名进行认证 参考 小结 本文记录了使用OpenSSL指令测试椭圆曲线签名算法ECDSA&#xff0c;进行了以下操作&#xff1a;生成椭圆曲线secp256r1 公私密…

shell find, while 使用,找出文件并批量修改文件名

linux find 命令和 while 命令联合使用案例_ITPUB博客 #!/bin/bash int1 while(( $int<5 )) doecho $intlet "int" done find 和 while 联合使用 echo find ./ -iname "\*.jpg" | while read f do#do somethingecho $f done 修改文件名 linux 找出…

基于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写入测试…