当前位置:网站首页>【Hot100】34. 在排序数组中查找元素的第一个和最后一个位置
【Hot100】34. 在排序数组中查找元素的第一个和最后一个位置
2022-07-05 12:56:00 【王六六的IT日常】
34. 在排序数组中查找元素的第一个和最后一个位置
中等题
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。
请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
题解:
在一个范围内,查找一个数字,要求找到这个元素的开始位置和结束位置,这个范围内的数字都是单调递增的,即具有单调性质,因此可以使用二分来做。
两次二分,第一次二分查找第一个t>=target的位置,第二次二分查找最后一个t<=target的位置。
查找成功则返回两个位置下标,否则返回[-1,-1]。
- 模板一:当我们将区间[l, r]划分成[l,mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1,计算mid时不需要加1,即mid=(l+r)/2。
- 模板二:当我们将区间[l, r]划分成[l,mid−1]和[mid,r]时,其更新操作是r=mid−1或者l=mid,此时为了防止死循环,计算mid时需要加1,即mid=(l+r+1)/2。
注意:
当左边界要更新为l = mid时,就令 mid =(l + r + 1)/2,相当于上取整,此时就不会因为r取特殊值 r = l + 1而陷入死循环了。
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums.length == 0) {
return new int[]{
-1,-1};
}
int l = 0, r = nums.length - 1; //二分范围
while( l < r) //查找元素的开始位置
{
int mid = (l + r )/2;
if(nums[mid] >= target) r = mid;
else l = mid + 1;
}
if( nums[r] != target) {
return new int[]{
-1,-1}; //查找失败
}
int L = r;
l = 0;
r = nums.length - 1; //二分范围
while( l < r) //查找元素的结束位置
{
int mid = (l + r + 1)/2;
if(nums[mid] <= target ) l = mid;
else r = mid - 1;
}
return new int[]{
L,r};
}
}
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums.length == 0){
return new int[]{
-1,-1};
}
int l = 0, r = nums.length - 1; //二分范围 左闭右闭
//查找元素的开始位置
while( l < r){
int mid = (l + r )/2;
if(nums[mid] >= target){
r = mid;
} else{
l = mid + 1;
}
}
if( nums[r] != target){
return new int[]{
-1,-1}; //查找失败
}
int L = r;
l = 0; r = nums.length - 1; //二分范围
//查找元素的结束位置
while( l < r)
{
int mid = (l + r + 1)/2; //注意
if(nums[mid] <= target ){
l = mid;
} else {
r = mid - 1;
}
}
return new int[]{
L,r};
}
}
边栏推荐
- Principle and performance analysis of lepton lossless compression
- Rocky基础命令3
- Yyds dry goods inventory # solve the real problem of famous enterprises: move the round table
- 155. Minimum stack
- AVC1与H264的区别
- Solve Unicode decodeerror: 'GBK' codec can't decode byte 0xa2 in position 107
- Rocky basics 1
- 石臻臻的2021总结和2022展望 | 文末彩蛋
- DataPipeline双料入选中国信通院2022数智化图谱、数据库发展报告
- Taobao short video, why the worse the effect
猜你喜欢

Put functions in modules

国际自动机工程师学会(SAE International)战略投资几何伙伴

MySQL 巨坑:update 更新慎用影响行数做判断!!!

Principle and performance analysis of lepton lossless compression

MySQL giant pit: update updates should be judged with caution by affecting the number of rows!!!

阿里云SLB负载均衡产品基本概念与购买流程

The Research Report "2022 RPA supplier strength matrix analysis of China's banking industry" was officially launched

uni-app开发语音识别app,讲究的就是简单快速。

Pandora IOT development board learning (HAL Library) - Experiment 7 window watchdog experiment (learning notes)

Shu tianmeng map × Weiyan technology - Dream map database circle of friends + 1
随机推荐
RHCSA4
SAP SEGW 事物码里的 Association 建模方式
[Nacos cloud native] the first step of reading the source code is to start Nacos locally
解决uni-app配置页面、tabBar无效问题
946. 验证栈序列
AVC1与H264的区别
SAP ui5 objectpagelayout control usage sharing
Introduction to the principle of DNS
MySQL giant pit: update updates should be judged with caution by affecting the number of rows!!!
Pycharm installation third party library diagram
百日完成国产数据库opengausss的开源任务--openGuass极简版3.0.0安装教程
阿里云SLB负载均衡产品基本概念与购买流程
RHCSA2
Hiengine: comparable to the local cloud native memory database engine
Principle and configuration of RSTP protocol
Lepton 无损压缩原理及性能分析
爱可生SQLe审核工具顺利完成信通院‘SQL质量管理平台分级能力’评测
初识Linkerd项目
Taobao short video, why the worse the effect
量价虽降,商业银行结构性存款为何受上市公司所偏爱?