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

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

时间:2025-01-22 17:01:25浏览次数:1  
标签:right target nums int 34 start 查找 排序 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]

解法一:
遍历数组
 1 class Solution {
 2     public int[] searchRange(int[] nums, int target) {
 3         int[] res = {-1,-1};
 4         for(int i=0;i<nums.length;i++) {
 5             if(nums[i]==target) {
 6                 res[0] = i;
 7                 break;
 8             }
 9         }
10         for(int i=nums.length-1;i>=0;i--) {
11             if(nums[i]==target) {
12                 res[1] = i;
13                 break;
14             }
15         }
16         return res;
17     }
18 }

 

 

解法二:

 1 class Solution {
 2     public int[] searchRange(int[] nums, int target) {
 3         int left = 0, right = nums.length - 1;
 4         while (left <= right) {
 5             int mid = left + (right - left) / 2;
 6             if (nums[mid] < target) {
 7                 left = mid + 1;
 8             } else if (nums[mid] > target) {
 9                 right = mid - 1;
10             } else {
11                 // 找到目标值,向左右扩展以找到开始和结束位置
12                 int start = mid, end = mid;
13                 while (start >= 0 && nums[start] == target) {
14                     start--;
15                 }
16                 while (end < nums.length && nums[end] == target) {
17                     end++;
18                 }
19                 // 返回开始和结束位置
20                 return new int[]{start + 1, end - 1};
21             }
22         }
23         // 目标值不存在
24         return new int[]{-1, -1};
25     }
26 }

 

 

解法三:

 

 1 class Solution {
 2 
 3     public int[] searchRange(int[] nums, int target) {
 4         int left = 0;
 5         int right = nums.length - 1;
 6         int first = -1;
 7         int last = -1;
 8         // 找第一个等于target的位置
 9         while (left <= right) {
10             int middle = (left + right) / 2;
11             if (nums[middle] == target) {
12                 first = middle;
13                 right = middle - 1; //重点
14             } else if (nums[middle] > target) {
15                 right = middle - 1;
16             } else {
17                 left = middle + 1;
18             }
19         }
20 
21         // 最后一个等于target的位置
22         left = 0;
23         right = nums.length - 1;
24         while (left <= right) {
25             int middle = (left + right) / 2;
26             if (nums[middle] == target) {
27                 last = middle;
28                 left = middle + 1; //重点
29             } else if (nums[middle] > target) {
30                 right = middle - 1;
31             } else {
32                 left = middle + 1;
33             }
34         }
35 
36         return new int[]{first, last};
37     }
38 
39 }

 

标签:right,target,nums,int,34,start,查找,排序,left
From: https://www.cnblogs.com/promenader1/p/18686389

相关文章

  • 打卡信奥刷题(647)用C++信奥P8342[普及组/提高] [COCI2021-2022#6] Med
    [COCI2021-2022#6]Med题目描述今天是公开赛的最后一轮。人们知道这两个比赛采用相同的计分系统。更准确地说,两场比赛都有666轮,每轮的积分在......
  • C语言程序设计十大排序—希尔排序
    文章目录1.概念✅2.希尔排序......
  • 写一个方法实现“插入排序算法”,并解释下时间复杂度和空间复杂度
    插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供......
  • 【Azure APIM】APIM服务配置网络之后出现3443端口不通,Management Endpoint不健康状态
    问题描述APIM服务在配置网络之后,查看网络状态发现ManagementEndpoint是不健康状态,提示无法连接到3443端口。错误消息:Failedtoconnecttomanagementendpointatxxxxxxxx.management.azure-api.cn:3443foraservicedeployedinavirtualnetwork.Makesuretofollo......
  • P2234 [HNOI2002] 营业额统计
    P2234[HNOI2002]营业额统计题目翻译:给定\(n\)个数,每一个数都要统计其最小波动值,波动值的定义是当天银收额和之前某次的营收额的差的绝对值,而要求每一天最小波动值的和(第一天波动值为当天营收额)思路:分析题目可以发现,最小波动值就是当天营收额与之前小于它的最大营收额的差......
  • [超表面论文快讯-34] Light: Science & Applications-电磁超材料强化学习智能体-北京
    栏目介绍:“论文快讯”栏目旨在精简地分享一周内发表在高水平期刊上的Metasurface领域研究成果,帮助读者及时了解领域前沿动态,如果对专栏的写法或内容有什么建议欢迎留言,后续会陆续开启其他专栏,敬请期待。论文基本信息标题:Electromagneticmetamaterialagent作者:......
  • 【题解】Luogu P4340 [SHOI2016] 随机序列
    简单手摸后发现,答案就是这么一个式子:\[(3^{n-1}-3^{n-2})a_1+(3^{n-2}-3^{n-3})a_1a_2+\dots+(3^1-3^0)a_1a_2\dotsa_{n-1}+a_1a_2\dotsa_n\]啊当然证明也是好证的,对于\(a_1\)这一项,它后面放+或-都会对系数加一,而放*不会影响系数,因此系数就是总数的三分之二。其它前缀......
  • 33. 搜索旋转排序数组
    整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处经......
  • C语言程序设计十大排序—冒泡排序
    文章目录1.概念✅2.冒泡排序......
  • 三种二分查找写法(红蓝染色法理解)
    二分查找使用前提:有序数组用红蓝染色法理解二分查找数组中>=某个数的区间(闭区间写法)定义红色区间表示<target的区间,蓝色区间表示>=target的区间,[left,right]区间是还未确定的区间采用闭区间的写法,初始时闭区间范围为[0,n-1],即所有数都不确定,接着取中间下标mid,判断mid和ta......