Leetcode - 二分查找 | 在排序数组中查找元素的第一个和最后一个位置

题目一:二分查找

二分查找

看到这道题之后,很快就能想到暴力的解法,把数组遍历一遍就能找到答案,时间复杂度O(n)。

假设存在一批数字[1,1,3,4,5,6,7,8],目标数字是5。

我想在这一批数字中找到5这个数字,该如何找?当我随机挑选了一个数字4的时候,4比5小,4左边的数字都比4小,所以可以在[5,8]区间找5这个数字,继续随机挑选了7这个数字,7比5大,7后面的数字都比7大,所以可以继续缩小区间,把目标数字定位在[5,6]区间内。

二分查找算法

  1. 确定查找范围的起始点和终止点。
  2. 计算中间点,查看中间点的元素值与目标值的关系。
  3. 如果中间点的元素值等于目标值,查找成功。
  4. 如果中间点的元素值大于目标值,说明目标值可能在左半部分,缩小查找范围至左半部分。
  5. 如果中间点的元素值小于目标值,说明目标值可能在右半部分,缩小查找范围至右半部分。
  6. 重复以上步骤,直到找到目标值或确定目标值不在数组中。

当使用二分查找算法查找目标值时,我们首先需要一个有序数组。让我们尝试查找目标值为7的索引,假设有序数组为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。

初始状态: 设定查找范围的起始点(left)和终止点(right)分别为数组的第一个和最后一个元素。此时,left = 0,right = 9。

第一轮查找: 计算中间点的索引(mid)为 (left + right) >> 1 = 4,对应的值为 5。由于目标值 7 大于 5,我们缩小查找范围到右半部分。更新 left = mid + 1,即 left = 5。

第二轮查找: 新的中间点索引为 (left + right) >> 1 = 7,对应的值为 8。由于目标值 7 小于 8,我们缩小查找范围到左半部分。更新 right = mid - 1,即 right = 6。

第三轮查找: 新的中间点索引为 (left + right) >> 1 = 5,对应的值为 6。由于目标值 7 大于 6,我们缩小查找范围到右半部分。更新 left = mid + 1,即 left = 6。

第四轮查找: 新的中间点索引为 (left + right) >> 1 = 6,对应的值为 7。因此,我们找到了目标值 7,并返回索引 6。

代码解析

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

题目二:在排序数组中查找元素的第一个和最后一个位置

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

暴力解法:从前往后扫描,记录下来遇到目标数字的位置即可。

代码解析

依旧使用二分,

class Solution {
public:vector<int> searchRange(vector<int>& nums, int t) {int l = 0, r = nums.size() - 1;int n = nums.size();int mid;int ansl = -1;int ansr = -1;if (n == 0){return {ansl, ansr};}while (l < r){   mid = l + (r - l >> 1);if (nums[mid] < t) l = mid + 1;else r = mid;}ansl = l;l = 0, r = n - 1;while (l < r){mid = l + (r - l + 1 >> 1);if (nums[mid] > t) r = mid - 1;else l = mid;}ansr = l;if (nums[ansl] != t || nums[ansr] != t) return {-1, -1};return {ansl, ansr};}  
};

模板

// 确定左端点
while (l < r)
{   mid = l + (r - l >> 1);if (……) l = mid + 1;else r = mid;
}// 确定右端点
while (l < r)
{mid = l + (r - l + 1 >> 1);if (……) r = mid - 1;else l = mid;
}

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

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

相关文章

面试宝典-【redis】

目录 1.什么是缓存穿透 ? 怎么解决 ? 2.什么是布隆过滤器 3.什么是缓存击穿 ? 怎么解决 ? 4.什么是缓存雪崩 ? 怎么解决 ? 5.redis做为缓存&#xff0c;mysql数据如何与redis进行同步?(双写) 6.排他锁是如何保证读写、读读互斥的呢&#xff1f; 7.你听说过延…

Java EE之wait和notify

一.多线程的执行顺序 由于多个线程执行是抢占式执行&#xff0c;就会导致顺序不同&#xff0c;同时就会导致出现问题&#xff0c;就比如俩个线程同时对同一个变量进行修改&#xff0c;我们难以预知执行顺序。 但在实际开发中&#xff0c;我们希望代码按一定的逻辑顺序执行&am…

C++ 多状态dp

目录 按摩师 打家劫舍 打家劫舍2 删除并获得点数 粉刷房子 按摩师 面试题 17.16. 按摩师 最大值问题 f : 预约此次的最长时间 g &#xff1a;不预约此次的最长时间 出现的错误&#xff1a;return max(f[n - 1]), g[n - 1]); 注意&#xff1a;①题目没给nums的范围&…

uniapp 云开发笔记

uniapp云开发官方文档https://uniapp.dcloud.io/uniCloud/learning.html 新建 关联云空间 云函数获取用户openID uniCloud API列表https://uniapp.dcloud.io/uniCloud/cf-functions.html#unicloud-api%E5%88%97%E8%A1%A8 自建云函数login event中包含前端传来的参数 uniCloud.…

Linux第74步_“设备树”下的LED驱动

使用新字符设备驱动的一般模板&#xff0c;以及设备树&#xff0c;驱动LED。 1、添加“stm32mp1_led”节点 打开虚拟机上“VSCode”&#xff0c;点击“文件”&#xff0c;点击“打开文件夹”&#xff0c;点击“zgq”&#xff0c;点击“linux”&#xff0c;点击“atk-mp1”&am…

使用阿里云服务器搭建网站教程,就这么简单!

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云百科aliyunbaike.com以搭建WordPress网站博客为例&#xff0c;来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&a…

OS-Copilot:实现具有自我完善能力的通用计算机智能体

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ AI 缩小了人类间的知识和技术差距 论文标题&#xff1a;OS-Copilot: Towards Generalist Computer Agents with Self-Improvement 论文链接&#xff1a;https://arxiv.org/abs/2402.07456 项目主页&a…

软件报错提示缺少D3DCompiler_47.dll文件怎么解决

许多用户在运行游戏或电脑软件时&#xff0c;遇到了一个提示“找不到d3dcompiler_47.dll”的错误消息。这个问题相当普遍&#xff0c;这个错误通常是由于系统中缺少关键的d3dcompiler_47.dll文件所导致的&#xff0c;而这个文件是很多应用程序运行的必要条件&#xff0c;特别是…

ES分页查询的最佳实践:三种方案

Elasticsearch&#xff08;ES&#xff09;中进行分页查询时&#xff0c;最佳实践取决于具体的使用场景和需求。 以下是对每种分页方法的简要分析以及它们适用的情况&#xff1a; 1. From Size 最常见且直观的方法&#xff0c;通过from参数指定跳过多少条记录&#xff0c;si…

【MySQL】表的增删改查——MySQL基本查询、数据库表的创建、表的读取、表的更新、表的删除

文章目录 MySQL表的增删查改1. Create&#xff08;创建&#xff09;1.1 单行插入1.2 多行插入1.3 替换 2. Retrieve&#xff08;读取&#xff09;2.1 select查看2.2 where条件2.3 结果排序2.4 筛选分页结果 3. Update&#xff08;更新&#xff09;3.1 更新单个数据3.2 更新多个…

【Python】time模块

专栏文章索引&#xff1a;Python 目录 一、介绍​编辑 二、常用函数​编辑 一、介绍 Python 的 time 模块提供了处理时间的函数。 二、常用函数 1.time()&#xff1a;返回当前时间的时间戳&#xff08;从1970年1月1日开始计时的秒数&#xff09;。 import timecurrent_ti…

【Python数据结构与判断1/7】复杂的多向选择

目录 导入 举个栗子 代码优化 elif 栗子 执行顺序 情况一 情况二 情况三 if-elif-else特性 三种判断语句小结 if if-else if-elif-else 嵌套语句 if嵌套 栗子 执行顺序 相互嵌套 Tips Debug 总结 导入 在前面&#xff0c;我们学习了单向选择的if语句和多项…