首页 > 其他分享 >在排序数组中查找元素的第一个和最后一个位置---二分查找

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

时间:2023-02-26 11:34:28浏览次数:58  
标签:二分 target nums mid --- 查找 数组

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

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:二分查找

其实理解二分查找并不应该局限于简单的有序即可二分,而是要从区间划分的角度进行理解,就可以更加简单。二分查找可以查找任意可以按照某种性质划分为两个区间的数组并且找到对应的端点。从区间划分的角度思考二分常常会变得比较容易理解以及简单。
从本题来看,查找元素的第一个位置,可以按照<target以及>=target将数组划分为两个区间,我们需要查找的是右区间的左端点,就是元素出现的第一个位置。取中间节点(l + r) / mid,如果nums[mid] >= target, r = mid;否则 l = mid+1.(自行脑补一张图即可,看看mid落在哪个区间以及lr如何更新).
查找元素的最后一个位置,可以按照<= target 以及> target 将数组划分为两个区间,我们需要查找的是左区间的右端点。取中间节点(l+r)/2,如果nums[mid]<=target,l=mid;否则r = mid-1;注意此时要取mid = (l + r + 1)/2,因为在只有两个数的数组中,l+r >>1 的值为l,下取整啊,然后如果恰好l = mid也就是l = l那么就会陷入死循环中。

code

class Solution {
public:
    //二分查找
    //划分为<= 和>,查找<=区间的右端点
    //划分为< 和 >=,查找>=区间的左端点

    vector<int> searchRange(vector<int>& nums, int target) {
        
        if(nums.size() == 0) return {-1,-1};
        
        int l = 0,r = nums.size() -1;
        vector<int> ans;

        while(l < r)
        {
            int mid =(l + r) / 2;
            if(nums[mid] >= target) r = mid;
            else l = mid +1;
        }

        if(nums[l] == target) ans.push_back(l);
        else return {-1,-1};

        l = 0,r = nums.size() -1;

        while(l < r)
        {
            int mid = (l + r + 1) / 2;
            if(nums[mid] <= target) l = mid;
            else r = mid - 1;
        }

        ans.push_back(l);

        return ans;
    }
};

标签:二分,target,nums,mid,---,查找,数组
From: https://www.cnblogs.com/huangxk23/p/17156341.html

相关文章

  • Attention 和 Self-Attention [一万字拆解 Attention,全网最详细的注意力机制讲解]
    上一篇文章从RNN到Attention我们在RNN的Encoder-Decoder框架下引入了Attention机制,用来解决RNN模型中梯度下降以及性能瓶颈问题,如下图所示:上图就是引入了Atten......
  • 搜索旋转排序数组---二分查找
    搜索旋转排序数组整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k]......
  • Jumps,cf1455b,VJ-HZNUFeb1
    (仅做为个人笔记,反思)题目意思:开始在原点,返回到达x位置的操作数操作:1.在第k轮时走到+k位置(y+k)2.走-1位置(y-1)思路:先一直选择操作1,直到y>=x。1.若等于......
  • C程序集成Backward-cpp使用示例
    原文地址:https://www.cnblogs.com/liqinglucky/p/backward-in-C.html在文章Backward-cpp:Segmentationfault时打印backtrace中已经介绍了backward-cpp的编译安装。不过......
  • 考研算法辅导课笔记:第十七讲--枚举和位运算
    这节课主要讲枚举,位运算成员函数booloperator<(constRange&b)const{};括号中的const表示参数b对象不会被修改;在函数末尾加CONST这样的函数叫常成员函数。常成员函......
  • OpenSSL 介绍(4)--非对称加密
    本文主要介绍如何使用OpenSSL来进行非对称加解密,使用的算法为RSA,DSA算法的使用方法类似;文中所使用到的软件版本:OpenSSL1.1.1s、CentOS 7.9.2009。1、非对称加密算法......
  • CDC设计实例-02
    CDC设计实例加速器假设要处理一项业务比如图像处理,有两种方向,第一种选择一些通用的处理器CPU\GPU\DSP等通用的处理器,第二种是将算法映射成IP,直接使用IP进行处理图像处理......
  • ECharts笔记--实现地图版的数据显示(存在bug/┭┮﹏┭┮/)
    相关描述前几天实现了柱状图等图的数据可视化,现在就来接着实现一下“更加”形象的数据可视化吧!具体实现如下<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/......
  • NEMU PA 3-3 实验报告
    一、实验目的在上一章PA3-2中,我们实现了分段机制,将48位的虚拟地址vaddr转换成了laddr。为什么不是paddr呢?这就要说到这一章要完成的东西:**分页机制**。从80386开始,计算......
  • springboot3.0整合GraalVM-Native-Support,打包本地exe(native-image)。添加native-maven
    0.【idea新建一个springbootdemo项目】勾选GraalVMNativeSupport。其它略(太基础了)1.【环境准备】安装GraalVM、VisualStudio、NativeImage​​https://gitee.com/lishu......