力扣精选算法100题——在排序数组中查找元素的第一个和最后一个位置(二分查找专题)

news2024/11/17 9:41:02

目录

第一步:了解题意 

第二步:算法原理

🚩查找区间左端点值

❗处理细节

循环条件:

求中点

🚩查找区间右端点值

❗处理细节

循环条件

求中点

🚩总结

第三步:代码实现

第四步:总结模板


第一步:了解题意 

  • 本题是返回的是(在数组中与目标值相等的开始位置和结束位置)如果是{1,2,3,3,3,4,5}我们只需返回{2,4}位置即可,只要返回开始位置和结束位置,中间位置不用返回
  • 如果不存在目标值target,那么我们就返回{-1,-1} 

第二步:算法原理

这一题暴力解法确实是很简单的去实现,但是这一题明确说明了需要时间复杂度为logN来实现,这就意味着不能用暴力解法O(N)。

二分查找法的本质:看区间是否有“二段性”。取一个点能分成俩部分,有一部分是满足条件,则可用二分查找算法。它并不是非得分成一半一半,也可以是三分之一,四分之一,只是复杂度的问题。

其实我们可以利用三分四分二分都可以解决问题,但是我们最合理的是二分方法解决问题,因为用到概率学的期望值中,我们确实如果找到目标值可以在1/4中的小部分,但是我们也可能在1/4的另一个大部分,所以期望值来看,平分是最好的。最终选取中间点进行划分,二分查找时间复杂度最小。


本题是找到开始位置和结束位置,我们可以从查找区间的左端点值和区间的右端点值入手。

🚩查找区间左端点值

我们看到这里,我们会不会想到划分区间(二分查找的本质是'能有“二分段”)我们可以划分【小于t】【大于等于t】俩部分。这时候我们就可以二分查找思路来解题。

  • 由于x<t的话肯定在小于t的区间内,那里面的结果是不可能存在等于target的所以我们给left=mid+1
  • 而x>=t的时候,肯定是在大于等于t的区间内,所以里面的结果是可能存在等于target的,如果mid正好对应的是等于最左边的3的时候,我们是不能给right=mid-1的,所以我就给right=mid即可

❗处理细节

循环条件:

存在俩种情况left<=right和left<right。

最终left是肯定会达到区间的左端点的值的,而right=mid一直在靠近最左端值,最终也会到达端点值,所以我们不需要进行left=right再循环,因为那个时候我们已经指向了结果,我们只需要判断一下left对应的值是否等于target即可。

最终选择left<right.

求中点

求中点:

mid=left+(right-left)/2

mid=left+(right-left+1)/2

这俩个中点值,一个值的是在偶数的时候取左值还是右值。

而我们在取区间的左端的时候,我们的left=mid+1  right=mid.

如果我们选择mid=(right+left+1)/2+left的情况下,我们在遇到这个情况下,mid在right的位置,然后right依旧mid,我们就陷入了死循环,我们需要mid指向的是偶区间的左边,而不是右边,因为right=mid,会导致死循环。所以遇到查找区间的左端点值我们选择mid=(right-left)/2+left

🚩查找区间右端点值

  • 由于x>t的话肯定在大于t的区间内,那里面的结果是不可能存在等于target的所以我们给right=mid-1
  • 而x<=t的时候,肯定是在小于等于t的区间内,所以里面的结果是可能存在等于target的,如果mid正好对应的是等于最左边的3的时候,我们是不能给left=mid+1的,所以我就给left=mid即可

❗处理细节

循环条件

和上述的查找区间的左端点值一样。

求中点

而我们在取区间的右端点的时候,我们的left=mid  right=mid-1.

如果我们选择mid=(right+left)/2+left的情况下,我们在遇到这个情况下,mid在left的位置,然后left依旧mid,我们就陷入了死循环,我们需要mid指向的是偶区间的右边,而不是左边,因为left=mid,会导致死循环。所以遇到查找区间的右端点值我们选择mid=(right-left+1)/2+left


🚩总结

  • 循环条件:left<right

区间左端点,区间右端点我们都不需要再进行left=right的循环,所以循环条件是left<right

  • 求中点

区间左端点:mid=(right-left)/2+left    因为left=mid+1  right=mid  偶区间的左边

区间右端点:mid=(right-left+1)/2+left  因为left=mid  right=mid-1  偶区间的右边


第三步:代码实现

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.size()==0)
        {
            return {-1,-1};
        }
        int left=0,right=nums.size()-1;
        //取左端点值
        int begin=0;
        while(left<right)
        {
            int mid=(right-left)/2+left;
            if(nums[mid]<target)left=mid+1;
            else right=mid;
        }
        //判断是否有结果
        if(nums[left]!=target)return {-1,-1};
        else begin=left;

        //取右端点值
        left=0,right=nums.size()-1;
        while(left<right)
        {
            int mid=(right-left+1)/2+left;
            if(nums[mid]<=target)left=mid;
            else right=mid-1;
        }
        return {begin,left};
    }
};

第四步:总结模板

这只是初步的给个模板,后续会有题目来熟练认知这段代码。


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

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

相关文章

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests&#xff0c;支持多个编译器安装使用。 我下载安装到Android Studio上&#xff0c;不需要登录直接可以使用。 可以直接提问&#xff0c;支持中文。

k8s-基础知识(Service,NodePort,CusterIP,无头服务,NameSpace,资源限制)

Node Node 是 Pod 真正运行的主机&#xff0c;可以是物理机&#xff0c;也可以是虚拟机。 Annotations 原文链接 Annotations 是 key/value 形式附加于对象的注解。不同于 Labels 用于标志和选择对象&#xff0c;Annotations 则是用来记录一些附加信息&#xff0c;用来辅助应…

套接字的多种可选项(修改IO缓冲区大小及TCP_NODELAY)

标题套接字的多种可选项 我们进行套接字编程时往往只关注数据通信&#xff0c;而忽略了套接字具有的不同特性。但是&#xff0c;理解这些特性并根据实际需要进行更改也十分重要。 从上表可以看出&#xff0c;套接字可选项是分层的。IPPROTOIP层可选项是IP协议相关事项&#x…

顺序表和链表【数据结构】【基于C语言实现】【一站式速通】

目录 顺序表 顺序表的优点 顺序表的实现 1.结构体的定义 2.初始化数组 3.插入数据 4.其余接口函数的实现 5.释放内存 顺序表的缺陷 单向链表 单向链表的优点 单向链表的实现 1.链表的定义 2.链表的初始化 3.其余接口函数的实现 5.释放内存 单向链表的缺陷 双…

qt学习:实战 http请求获取qq的吉凶

目录 利用的api是 聚合数据 的qq号码测吉凶 编程步骤 配置ui界面 添加头文件&#xff0c;定义网络管理者和http响应槽函数 在界面的构造函数里创建管理者对象&#xff0c;关联http响应槽函数 实现按钮点击事件 实现槽函数 效果 利用的api是 聚合数据 的qq号码测吉凶 先…

【书生·浦语大模型实战】“PDF阅读小助手”学习笔记

1 参考资料 《新版本Lmdeploy量化手册与评测》 2 项目资料 项目主页&#xff1a;【tcexeexe / pdf阅读小助手】 3 模型运行测试 在InternStudio平台中选择A100 (1/4)的配置&#xff0c;镜像选择Cuda11.7-conda&#xff0c;可以选择已有的开发机langchain&#xff1b; 3.1…

科技助力“双碳”:墨水屏电子桌牌在绿色办公中的作用

随着科技的发展&#xff0c;人们对绿色环境可持续发展也越来越重视&#xff0c;所以&#xff0c;我国在几年前&#xff0c;就提出了“双碳”政策&#xff08;即碳达峰与碳中和的简称。2020年9月中国明确提出2030年“碳达峰”与2060年“碳中和”目标&#xff09;&#xff0c;而作…

vivado 配置I/O端口

配置I/O端口 AMD设备支持可配置的SelectIO™ 接口驱动程序和接收器&#xff0c;支持各种标准接口。这些标准接口包括输出的可编程控制强度和转换速率&#xff0c;使用DCI的片上终端&#xff0c;以及内部VREF的生成。你可以配置一个或多个I/O端口以定义I/O标准、驱动器强度、转…

【Java与网络2】:HTTP核心知识与Curl工具

HTTP是当前应用最为广泛的通信协议&#xff0c;我们上网、玩游戏、刷视频、查美食都离不开HTTP协议。当我们做开发的时候&#xff0c; 需要经常和H5、Android、IOS、PC前端等不同团队的同学打交道&#xff0c;大家讨论的核心问题之一就是交互的时候协议怎么定&#xff0c;而这个…

Dijkstra算法-lanqiao1122

#include <bits/stdc.h> using namespace std; const long long INF 0x3f3f3f3f3f3f3f3fLL; const int N 3e5 5; struct edge{int from, to;//边&#xff1a;起点&#xff0c;终点&#xff0c;权值&#xff1b;起点from没有用到&#xff0c;e[i]的i就是fromlong long …

【C++干货铺】C++中的IO流和文件操作

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 C语言的输入输出 流是什么&#xff1f; C的IO流 C标准IO流 C文件IO流 文本文件读写 二进制文件的读写 stringstream的简单介绍 将数值类型数据格式化为字…

Spring Security 存储密码之 JDBC

Spring Security的JdbcDaoImpl实现了UserDetailsService接口,通过使用JDBC提供支持基于用户名和密码的身份验证。 JdbcUserDetailsManager扩展了JdbcDaoImpl,通过UserDetailsManager接口提供UserDetails的管理功能。 当Spring Security配置为接受用户名/密码进行身份验证时,…

研发日记,Matlab/Simulink避坑指南(六)——字节分割Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南&#xff08;一&#xff09;——Data Store Memory模块执行时序Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》…

HPE ProLiant MicroServer Gen8更新固件

前几天因为没有shutdown OMV NAS便关了电源&#xff0c;导致其中一个硬盘损坏&#xff08;用DG检查有9个坏区&#xff09;&#xff0c;从而整个硬盘数据都没法读取&#xff0c;于是想着装个windows server会不会更好点&#xff0c;至少对windows熟悉点&#xff0c;硬盘扫描恢复…

数据结构-顺序表详解专题

目录 顺序表 1.简单了解顺序表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 2.3typedef命名作用 3.动态顺序表的实现 SeqList.h SeqList.c test.c 顺序表 1.简单了解顺序表 顺序表是线性表的一种&#xff0c;线性表是在逻辑上是线性结构&#xff0c;在物理逻辑上并…

基于springboot+vue的校园资料分享平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Nginx与keepalived实现集群

提醒一下&#xff1a;下面实例讲解是在mac虚拟机里的Ubuntu系统演示的&#xff1b; Nginx与keepalived实现集群实现的效果 两台服务器都安装Nginx与keepalived&#xff1a; master服务器的ip(192.168.200.2) backup服务器的ip(192.168.200.4) 将 master服务器Nginx与keepalive…

JavaEE-自定义SSM-编写核心-解析yml文件

3.3.1 加载yml文件 编写yaml工厂&#xff0c;用于加载yml文件 package com.czxy.yaml;import java.io.InputStream;/*** 用于处理 application.yml文件* 1. 加载application.yml文件* 2. yaml工具类进行解析* Map<String, Map<String, Map<....>> >* …

线性代数----------学习记录

线性代数发展历程 &#xff08;1&#xff09;线性方程组&#xff1a;例如二元一次方程组&#xff1b; &#xff08;2&#xff09;行列式&#xff1a;determinant,克莱默&#xff0c;莱布尼兹&#xff1b; &#xff08;3&#xff09;矩阵&#xff1a;方程个数与未知数的个数可…

webug存在的越权漏洞-水平越权以及垂直越权的漏洞复现(超详解)

越权漏洞-webug、 1.登录 账号&#xff1a;admin 密码&#xff1a;admin 2.进入逻辑漏洞 3.进入越权修改密码靶场 &#xff08;1&#xff09;输入账号密码 进入进去会发现没有权限进入 方法一&#xff1a; 这里我们只需要将 127.0.0.1:8080/control/a/auth_cross/cross_a…