当前位置: 首页 > article >正文

Java每日刷题之二分算法

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

 转化 

 通过题目时间复杂度为O(logN),我们就可以联想到二分算法,但是我们前面学到的算法,是查找出,有序数组里的值,并不是求其中的范围,于是我们可以将找到这个值出现的范围转化为 

通过二分法找到最左边下标以及最右边下标

思路:

1.找到最左边下标

第一步:根据mid的与target的大小进行left和right的移动,如图,当t<=mid,说明最小下标点一定在左边,所以移动right ,  将right赋值给mid,重新进入循环,这样即可得到最左边的下标

2.细节处理

1.当right == left的同时,左端点就是这个点,所以循环条件为left < right

2.在mid范围内mid最大值比最小下标小1,所以left = mid+1;

3.当left和right中间无元素时,取中点方式的不同可能会造成死循环,分析图如下

4.得到值最左边下标

具体思路图如下

2.找到最右边下标

 实现思路

细节处理

由于right 在 t < mid内,所以在t < mid内,想要left 与right 相交,就得right = mid -1; 

取中间点的方法和上面找到最左边下标思路相同

注意 

考虑没有target值和数组为空的情况

代码实现

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] array = {-1,-1};
        if(nums.length == 0) return array;
        //找到左边界点
        int left = 0,right = nums.length-1;
        while(left<right){
            int mid = left +(right-left)/2;
            if(nums[mid] < target){
                left = mid+1;
            }else{
                right = mid;
            }
        }
        if(nums[left] != target) return array;
        else{
            array[0] = left;
        }
        //找到右边界点 
        left = 0;right = nums.length-1;
        while(left<right){
            int mid = left +(right-left+1)/2;
            if(nums[mid] > target){
                right = mid-1;
            }else{
                left = mid;
            }
        }
        if(nums[left] != target) return array;
        else{
            array[1] = right;
        } return array;
    }
   
}


http://www.kler.cn/a/384960.html

相关文章:

  • ThingsBoard规则链节点:Push to Edge节点详解
  • 阿里云实时数据仓库HologresFlink
  • 鸿蒙 APP 清除缓存
  • A day a tweet(sixteen)——The better way of search of ChatGPT
  • 信息安全工程师(81)网络安全测评质量管理与标准
  • Docker + Jenkins + gitee 实现CICD环境搭建
  • TDengine 集群能力:超越 InfluxDB 的水平扩展与开源优势
  • ‌webdriver.Chrome()参数简介
  • 【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】题库(1)
  • acmessl.cn推荐一款好用的免费申请ssl证书的平台
  • 飞凌嵌入式FET527N-C核心板现已适配Android 13
  • Python/FastAPI 的并发能力对比
  • 【EMNLP2024】面向长文本的文视频表征学习与检索模型 VideoCLIP-XL
  • 人工智能——小白学习指南
  • 算法详解——链表的归并排序非递归解法
  • 持续优化,构建更好地 auto git commit 体验
  • JMM(一)[volatilr关键字、乐观锁和悲观锁]
  • 摄像机视频分析软件下载LiteAIServer视频智能分析平台裸土检测
  • 理解Web登录机制:会话管理与跟踪技术解析(一)
  • 【C++】std::cout与std::cin缓冲区
  • 在鱼皮的模拟面试里面学习有感
  • 【Linux基础IO】文件描述符分配规则 重定向
  • 从0开始学习Linux——文件目录
  • docker安装zookeeper,以及zk可视化界面介绍
  • Me-LLaMA——用于医疗领域的新型开源大规模语言模型
  • 如何在 Vue.js 中优化 Element UI 长文本显示