算法日常・每日刷题--<二分查找>2

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/对于这道题

显然不能直接用原来的二分查找

他想要我们返回一个区间,那么我们应该找到左端点,也要找到右端点,返回这两个段点

找左端点

要先理清怎么找到左段点里面有很多的细节问题需要自己去理解

首先明白left,和right更新的逻辑,

我们现在要先确定左端点,不能在循环里面直接判断numsmid==targrt,这样我们并不能确定mid位置就是边界值的情况,

所以我们将情况分为<,和>=

numsmid<target ,mid左侧包含mid的值都是小于taget,此时更新逻辑是left=mid+1;

numsmid>=target ,mid右侧的值都是大于target,但是mid值不知道是不是就是边界情况,此时更新逻辑是right=mid

循环条件

在前面一个二分查找其实怎么样都行,但是这里就不ok了

循环条件分为一下两种

left<right,因为我们将left和right的更新逻辑已经确定了,并且中途没用判断numsmid==target情况,应该要采用这种

left<=right,如果采用这种会陷入死循环

mid更新逻辑

mid更新主要是关于对于偶数个数据的数组而言,

mid=left+(right-left+1)/2;这取得是中间靠后的位置

mid=left+(right-left)/2;这取得是中间靠前的位置

直接来试一下就ok

找右端点

找右段点的逻辑和左端点相似只是细节有一点不一样,这里不作过多赘述

cpp 复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        
        int n=nums.size();
        if(n==0)
        return {-1,-1};
        int left=0,right=n-1;
        
        int begin=0;
        int end=0;
        //找到左端点
        while(left<right)
        {
            int mid=left+(right-left)/2;
            if(nums[mid]>=target)
            right=mid;

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

            else
            right=mid-1;
            
        }
        end=left;
        return {begin,end};
    }
};
相关推荐
数聚天成DeepSData15 分钟前
CWRU轴承数据集官方入口与替代获取渠道(2025核实版)
算法
txzrxz27 分钟前
拓补排序讲解
c++·算法·图论·排序
深圳市快瞳科技有限公司33 分钟前
宠物行为识别:将日常行为转化为可量化的健康指标
人工智能·算法·计算机视觉·宠物
稚南城才子,乌衣巷风流1 小时前
长链剖分(Long Chain Decomposition)算法详解
算法·深度优先·图论
变量未定义~1 小时前
环境治理、染色时间、小蓝组网
算法
Ulyanov1 小时前
雷达导引头仿真中的坐标系——从惯性系到量测角
开发语言·python·算法·系统仿真·雷达信号处理·雷达导引头
玖玥拾1 小时前
LeetCode 13 罗马数字转整数
笔记·算法·leetcode
m沐沐2 小时前
【计算机视觉】OpenCV 物体跟踪——原理、算法与CSRT跟踪器实战
人工智能·python·深度学习·opencv·算法·计算机视觉·人脸识别
怪奇云呼军3 小时前
闪电智能 Voice Agent 怎样根据语速、停顿和追问方式切换话术?策略引擎拆解
开发语言·人工智能·网络协议·算法·语音识别·web app
稚南城才子,乌衣巷风流3 小时前
树链剖分(树剖)算法详解:从原理到实现
算法·深度优先