模块三——二分:34.在排序数组中查找元素的第一个和最后一个位置

文章目录

  • 前言
  • 题目描述
  • 算法原理
    • 细节问题
  • 代码实现

前言

相信通过本模块的第一篇博客,大家已经能够对二分有一个清晰的认知了,最好画画图来加深理解,以下是一些新的注意事项:

  1. 请⼤家⼀定不要觉得背下模板就能解决所有⼆分问题。⼆分问题最重要的就是要分析题意,然后确定要搜索的区间,根据分析问题来写出⼆分查找算法的代码。要分析题意,确定搜索区间,不要死记模板不要看左闭右开什么乱七⼋糟的题解。要分析题意,确定搜索区间,不要死记模板,不要看左闭右开什么乱七⼋糟的题解。要分析题意,确定搜索区间,不要死记模板,不要看左闭右开什么乱七⼋糟的题解。重要的事情说三遍。
  2. 模板记忆技巧:关于什么时候⽤三段式,还是⼆段式中的某⼀个,⼀定不要强⾏去⽤,⽽是通过具体的问题分析情况,根据查找区间的变化确定指针的转移过程,从⽽选择⼀个模板。
  3. 当选择两段式的模板时:在求 mid 的时候,只有 right = mid - 1 的情况下,才会向上取整(也就是 +1 取中间数)。

题目描述

题目链接:34.在排序数组中查找元素的第一个和最后一个位置
在这里插入图片描述
非递减顺序说明是递增或者不变的,根据这个特性说明这道题具有二段性,且题目已经要求是O(log n)的时间复杂度,那就可以确定是二分了。

算法原理

接下来我将用x表示一个数,resLeft表示结果左边界,resRight表示结果右边界:

  1. 左区间[left,resLeft - 1]都是小于x的,右区间[resLeft,right]都是大于等于x的;
  2. 因此关于mid的落点,我们可以分两种情况讨论:
    在这里插入图片描述
    在这里插入图片描述
    情况一:nums[mid] < target,舍去左区间,left更新到mid + 1;
    情况二:nums[mid] >= target,舍去右区间,right更新到mid。(中点向下取整
  3. 上述分析为寻找左边界的过程,其实就是使用了我们寻找左边界的模板,接着再根据题意使用寻找右边界的模板即可,忘了的同学可以再去看看,还是牢记一件事:分析题意,确定搜索区间,不要死记模板
  4. 左区间[left,resRight]都是小于等于x,右区间[resRight + 1,right]都是大于x;
  5. 分析mid:情况一:mid在左区间,left = mid;情况二:mid在右区间,right = mid - 1。(中点向上取整

细节问题

结束条件应该为left < right,left = right的时候就是结果,判断就会死循环。
寻找右边界后续移动左右指针的时候:
左指针:left = mid ,可能会原地踏步(⽐如:如果向下取整的话,如果剩下 1,2 两个元素,left == 1,right == 2,mid == 1。更新区间之后, left,right,mid的值没有改变,就会陷⼊死循环);
右指针: right = mid - 1 ,是会向前移动的,因此区间是会缩⼩的;

因此⼀定要注意,当 right = mid - 1的时候,要向上取整,寻找左边界同理可分析。

代码实现

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {//根据二段性可以使用二分int left = 0,right = nums.size() - 1;//记录结果int begin = 0,end = 0;//单独处理空数组if(nums.empty())return {-1,-1};//查找左端点while(left < right){int mid = left + (right - left) / 2;if(nums[mid] >= target){right = mid;}else if(nums[mid] < target){left = mid + 1;}}begin = (nums[left] == target) ? left : -1;left = 0,right = nums.size() - 1;//查找右端点while(left < right){int mid = left + (right - left + 1) / 2;if(nums[mid] <= target){left = mid;}else if(nums[mid] > target){right = mid - 1;}}end = (nums[left] == target) ? left : -1;return {begin,end};}
};

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

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

相关文章

TaskWeaver使用记录

TaskWeaver使用记录 1. 基本介绍2. 总体结构与流程3. 概念细节3.1 Project3.2 Session3.3 Memory3.4 Conversation3.5 Round3.6 Post3.7 Attachment3.8 Plugin3.9 Executor 4. 代码特点5. 使用过程5.1 api调用5.2 本地模型使用5.3 添加插件 6. 存在的问题与使用体验6.1 判别模型…

【Qt 学习笔记】Qt常用控件 | 显示类控件 | Label的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件 | Label的使用及说明 文章编号&#xff1a;Q…

qt实现不定数量的按钮向前向后移动展示

按钮模拟移动 引言示例代码第一种思路开发环境代码结构实现代码第二种思路开发环境实现代码第三种思路开发环境实现代码总结引言 此文主要记录用qt实现按钮的移动,具体效果如下: 模拟按钮移动效果 示例代码 本文记录了三种实现方式。 第一种 思路 用动态数组vector存放创…

美国洛杉矶服务器的特点

美国洛杉矶的服务器提供多种优质的托管服务&#xff0c;具有较好的网络连接速度和稳定性。以下是一些洛杉矶服务器的特点和服务&#xff0c;rak小编为您整理发布。 1. **地理位置优势**&#xff1a;位于美国西海岸的洛杉矶机房离中国相对较近&#xff0c;这有助于减少延迟&…

深度剖析Gateway在微服务治理中的关键角色

目录 一、多层网关 二、Gateway 路由规则 2.1 路由 2.2 谓词 2.3 过滤器 三、路由声明规则 3.1 谓词 寻址谓词 请求参数谓词 时间谓词 自定义谓词 一、多层网关 首先我们先了解下一个请求是如何到达服务端并得到相应的。过程如图所示&#xff1a; 首先网址解析的第一步是 DN…

QT客户端的开发框架

针对QT客户端开发&#xff0c;目前存在多种框架&#xff0c;各有优缺点&#xff0c;具体选择哪种框架取决于您的具体需求和项目特点。以下是一些流行的QT客户端开发框架。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. Qt框架 Qt…

Golang | Leetcode Golang题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; func firstMissingPositive(nums []int) int {n : len(nums)for i : 0; i < n; i {for nums[i] > 0 && nums[i] < n && nums[nums[i]-1] ! nums[i] {nums[nums[i]-1], nums[i] nums[i], nums[nums[i]-1]}}for i …

element中file-upload组件的提示‘按delete键可删除’,怎么去掉?

问题描述 element中file-upload组件会出现这种提示‘按delete键可删除’ 解决方案&#xff1a; 这是因为使用file-upload组件时自带的提示会盖住上传的文件名&#xff0c;修改一下自带的样式即可 ::v-deep .el-upload-list__item.is-success.focusing .el-icon-close-tip {d…

C语言编译成bin文件关键过程

一、关键步骤 将单片机的源代码转换成二进制文件&#xff08;bin文件&#xff09;的过程涉及几个关键步骤&#xff0c;这些步骤是编译过程中的标准组成部分&#xff0c;主要包括以下步骤&#xff1a;预处理、编译、汇编、链接、二进制转换。 1、预处理 这是编译过程的第一步…

【Python-Spark(大规模数据)】

Python-Spark&#xff08;大规模数据&#xff09; ■ Spark■ PySparl编程模型■ 基础准备■ 数据输入■ RDD的map成员方法的使用■ RDD的flatMap成员方法的使用■ RDD的reduceByKey成员方法的使用■ 单词计数统计■ RDD的filter成员方法的使用■ RDD的distinct成员方法的使用■…

【每日力扣】41. 缺失的第一个正数 238. 除自身以外数组的乘积 189. 轮转数组

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 41. 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为…

0.5W 3KVDC 隔离单、双输出 DC/DC 电源模块——TPV-W5 24V 48V 系列

TPV-W5系列提供正负双输出和单输出&#xff0c;工业级环境温度&#xff0c;用于PCB安装的国际标准结构。此系列产品小巧&#xff0c;效率高&#xff0c;低输出纹波及能承受3000V以上的耐压&#xff0c;用于需要正负电压或单输出和高隔离电压的场合。封装有SIP和DIP可选。