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

L-4: 34--在排序数组中查找元素的第一个和最后一个位置

时间:2023-11-06 15:12:56浏览次数:27  
标签:right target nums -- mid 34 int 查找 left

给你一个按照非递减顺序排列的整数数组 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]
class Solution {
    public int[] searchRange(int[] nums, int target) {
        int first = -1, last = -1; 

        //两次二分查找,分别找第一个和第二个
        //思路:找到mid = target之后,然后分两部分直接用mid左右挪,找到第一个位置和最后一个位置
        //left和right在下面还需要重新初始化

        int left = 0, right = nums.length - 1;
        while (left <= right){
            int mid = (left + right) / 2;
            if (target < nums[mid]){
                right = mid - 1;
            }else if (target > nums[mid]){
                left = mid + 1;
            }else {
                //找第一个最左第一个等于target的位置
                first = mid;
                right = mid - 1;//重要,right左移,这句可以实现找到最左边第一次出现的target(先不管半右部分)
            }
        }

            //第二次查找最后一个等于target的位置
            //这次需要查找右半部分的,所以 left右移 ;left = mid + 1
            left = 0; right = nums.length - 1;
            while (left <= right){
            int mid = (left + right) / 2;
            if (target < nums[mid]){
                right = mid - 1;
            }else if (target > nums[mid]){
                left = mid + 1;
            }else {
                //找最右等于target的位置
                last = mid;
                left = mid + 1;//重要,right左移,这句可以实现找到最左边第一次出现的target(先不管半右部分)
                 }
            }
        return new int[] {first, last};
    }
}

 

标签:right,target,nums,--,mid,34,int,查找,left
From: https://www.cnblogs.com/18191xq/p/17812728.html

相关文章

  • 构建金融新核心生态!金融级数字底座“源启”与易捷行云可进化数字原生平台完成互认证
    近日,金融级数字底座“源启”顺利与易捷行云可进化数字原生云平台V6完成互认证。易捷行云云平台V6可支持金融机构核心应用实现高速响应、秒级扩容,并切实保障银行核心系统安全稳定,符合“源启”金融级数字底座(2.0版)技术规范,整体性能表现卓越,满足金融生产级要求。    金融级......
  • 类哈希计数
    1.CountingRoads-AtCoderabc061_b-VirtualJudge(vjudge.net)利用数组的值去替换数组的下标来简化计数过程1#include<bits/stdc++.h>2usingnamespacestd;34intn,m,a[51],b[51],c[51]={0};56intmain(){7cin>>n>>m;8for(int......
  • 搜索文档树,bs4其它用法,css选择器,selenium基本使用,selenium其它用法
    1搜索文档树......
  • 大型语言模型可以通过情绪刺激理解并实现增强
    作者:爱可可-爱生活链接:https://zhuanlan.zhihu.com/p/665119618来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。要点:探索了大型语言模型是否能理解和利用心理情感刺激来增强自身,这是人类智能的一个重要方面。提出“EmotionPrompt”方法,将原始......
  • (十一)Python之字符串类型
    字符串类型Python中的字符串用单引号(‘’)或双引号(”“)括起来,同时使用反斜杠(\)转义特殊字符语法:s=”a1a2...an“(n>=0)Python使用单引号(‘)、双引号(“)、三引号(”“”)来表示字符串、其中三引号可以由多行组成,它是编写多行文本的快捷语法,常用于文档字符串,在文件的特定地点,被当作注......
  • Java IO教程- Java文件
    创建文件我们可以从中创建一个 File 对象路径名父路径名和子路径名URI(统一资源标识符)我们可以使用File类的以下构造函数之一创建一个文件:File(Stringpathname)File(Fileparent,Stringchild)File(Stringparent,Stringchild)File(URIuri)如果我们有一个文件路......
  • 黑马pink html2
    的name属性,帮助区分标签和归类,单选按钮和复选框的name值必须是相同的。的value属性定义了默认值。的checked规定了初始由谁选中checked="checked"可以选择文件标签可以绑定一个表单元素,当光标点击标签时,就可自动选择表单元素:label的for属性和input的id属性一致其他表单控件......
  • 使用uniapp开发小程序getLocation报错
    uniapp中使用uni.getLocation()报错,报错如下:getLocation:failtheapineedtobedeclaredintherequiredPrivateInfosfieldinapp.json/ext.json 首先检查uniapp的manifest文件发现位置权限已经开启: 后翻阅微信文档后发现原来是微信官方做了调整,uniapp只勾选这个还......
  • BUUCTF_Crypto_WriteUp | url 编码
    题目下载附件解压缩得到txt文件,打开是一串字符:%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d分析每3位字符均以“%”开头,是URL编码的特征,结合标题猜测为URL编码。用HackBar解码得到Flag。Flagflag{and1=1}参考CTF常见编码及加解密(超全)......
  • 浅析移动政务发展:小程序成为新标配
    联网的发展,拉近了人与人之间的距离,而智能手机时代的到来,使世界变得越来越移动,从智能手机到移动应用,移动似乎已经成为公众生活不可分割的一部分,根据中国互联网络信息中心(CNNIC)发布的第47次《中国互联网络发展状况统计报告》显示,截至2020年12月,我国网民规模达9.89亿,较2020年3......