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

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

时间:2025-01-14 23:01:08浏览次数:3  
标签:二分 target nums mid 查找 数组 排序 left

leetcode 34
之前的博客里面有写到关于二分查找的实现方法,这次这个题目也需要使用到二分查找,关于二分查找的实现可以参考博客:二分查找

在这里插入图片描述

思路

由于题目中给出的数组是递增排序的,那么我们会优先考虑到使用二分查找法,数组中可能出现多个重复的target,我们要查找的就是第一个和最后一个的target的下标。
一开始看到这个题目,可能会考虑使用暴力解法,由于这个题目在复杂度上有限制O(logn),那么使用暴力解法应该是不能通过的,所以需要使用二分查找。
查找第一个target和最后一个target下标,我们可以进行拆分去计算,分别计算出**左边界值和右边界值**

左边界计算

1.首先使用二分查找找到第一个与target相等的值
2.判断如果这个值的左侧一项是比当前项更小
如果更小,那么说明这一项是第一个对应的目标值,mid作为左边界值
如果左侧一项和当前项一样,那么我们缩小查找范围,设置right = mid - 1; 右指针左移,然后重新进行二分查找

右边界计算

右边界的计算同左边界的计算一样
1.找到第一个与target相等的值
2.判断这个值的右侧一项是否比当前值更大
如果更大那么说明当前项是最后一个对应的目标值,mid作为右边界值
如果右侧一项和当前项一样,那么缩小查找范围,设置left = mid + 1; 左指针右移,然后重新进行二分查找

实现

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function (nums, target) {
    const leftBorder = getLeftBorder(nums,target);
    const rightBorder = getRightBorder(nums,target);
    return [leftBorder,rightBorder]
};
// 获取左边界
function getLeftBorder(nums, target) {
    let left = 0, right = nums.length - 1;
    while (left <= right) {
        const mid = Math.floor((left + right) / 2);
        const midNum = nums[mid];
        if (midNum === target) {
            // 边界条件考虑
            // 当mid = 0时一定是左边界,当中间值的左边一项小于中间值时,也一定是左边界
            if(mid === 0 || nums[mid-1] < midNum){
                return mid;
            }else{
                // 左边项和当前项一样,那么移动右指针缩短范围,继续二分
                right = mid - 1;
            }
        } else if (target > midNum) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1
}

// 获取右边界
function getRightBorder(nums, target) {
    let left = 0, right = nums.length - 1;
    while (left <= right) {
        const mid = Math.floor((left + right) / 2);
        const midNum = nums[mid];
        if (midNum === target) {
            // 如果右侧一项比当前项更大,那么说明是右边界
            if(mid === nums.length -1 || midNum < nums[mid+1]){
                return mid
            }else{
                left = mid + 1;
            }
        } else if (target > midNum) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1
}

以上就是这道题的思路和题解啦,看到此大家有什么更好更优化的思路呢?也欢迎多多分享~~

标签:二分,target,nums,mid,查找,数组,排序,left
From: https://blog.csdn.net/weixin_45799371/article/details/145149041

相关文章

  • LeetCode:23.合并K个排序链表
    LeetCode:23.合并K个排序链表解题思路新链表的下一个节点一定是k个链表头中的最小节点。考虑选择使用最小堆。解题步骤构建一个最小堆,并依次把链表头插入堆中。弹出堆顶接到输出链表,并将堆顶所在链表的新链表头插入堆中。等堆元素全部弹出,合并工作就完成了。classMinHeap{......
  • 【Javascript Day6】for循环练习及数组
    目录for循环练习数组1.构造数组2.字面量数组创建3.数组的遍历循环4.length的使用规则for循环练习按输入弹窗行数画菱形(奇偶皆可)varpro=prompt("请输入行数")varsum="";for(vari=1;i<=pro;i++){if(i<=parseInt((pro*1+1)/2)......
  • parallel programming in CUDA C(GPU并行程序实现数组求和 & Julia set)
    前言我们这节会学习到:Ⅰ.CUDA在实现并行性时采用的一种重要方式Ⅱ.用CUDAC编写第一段并行代码一、Summingvector#defineN10voidadd(int*a,int*b,int*c){inttid=0;//这是第0个CPU,因此索引从0开始while(tid<N){c[tid]=a[tid]+b[tid];......
  • C语言练习之姓名排序
     从今天开始,练习题的博客都会迎来一个升级,我们会注意更多细节,让这个程序尽可能的完善(尽可能想象到千奇百怪的输入,比如让输个数偏输入个字母的),尽量走向实际应用题干请设计一个程序,输入用户指定的数量的名字,然后根据名字长度排序,按长度由大到小进行输出思路名字长度排序(数组......
  • 排序算法专题总结
    分治基础-二分查找:二分查找是一种高效的查找算法先找到数组的中间位置mid,判断(1)如果要找的数x==a[mid]找到了,mid就是位置(2)如果要找的教x>a[mid],说明要找的数在后一半,递归在后一半找(3)如果要找的数x<a[mid],说明要找的数在前一半,递归在前一半找在下标为left~right之间的......
  • day01 704. 二分查找&&27. 移除元素
    二分查找(search方法)publicintsearch(int[]nums,inttarget){intleft=0;intright=nums.length-1;intmid;while(left<=right){mid=(left+right)/2;if(nums[mid]==target){returnmid;}elseif(nums[mid]<target){left=mid+1;}else{right=mid-1;}}retur......
  • 电脑“减肥”利器:两款重复文件查找神器大揭秘
    前言:        随着电脑使用时间的增长,我们往往会不知不觉地积累大量重复的软件和文件。手动一一核对这些重复项,不仅耗时费力,还容易遗漏。今天,我要为大家推荐两款重复文件查找神器,它们能够轻松帮我们清理硬盘空间,让电脑“瘦身”更高效。EasyDuplicateFinder:重复文件......
  • JS-32 数组方法_shift()/unshift()
    shift方法用于删除数组的第一个元素,并返回该元素。注意,该方法会改变原数组vararr=['字符串','zifuchuan','前端'];arr.shift()//'字符串'arr//['zifuchuan','前端']shift方法可以遍历并清空一个数组varlist=[1,2,3,4,5,6];varitem; while(item=list.shift()......
  • Spring MVC复杂数据绑定-绑定数组
    【图书介绍】《Spring+SpringMVC+MyBatis从零开始学(视频教学版)(第3版)》_【新华文轩】spring+springmvc+mybatis从零开始学(视频教学版)第3版正版-CSDN博客《Spring+SpringMVC+MyBatis从零开始学(视频教学版)(第3版)》(杨章伟,刘祥淼)【摘要书评试读】-京东图书【图书介绍......
  • 达梦误删数据,挖掘归档,查找误删数据的语句
    客户误删数据,没有开启慢日志,只有备份文件和归档日志,挖掘归档,分析删除数据影响的范围大小 1、概述可以使用DBMS_LOGMNR包对归档日志进行挖掘,重构出DDL和DML等操作,并通过获取的信息进行更深入的分析。相关限制说明如下:1)目前DBMS_LOGMNR只支持对归档日志进行分析,配置归......