当前位置:网站首页>【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};
}
}
边栏推荐
- SAP SEGW 事物码里的 ABAP Editor
- AVC1与H264的区别
- 蜀天梦图×微言科技丨达梦图数据库朋友圈+1
- Introduction to sap ui5 dynamicpage control
- How to protect user privacy without password authentication?
- About the single step debugging of whether SAP ui5 floating footer is displayed or not and the benefits of using SAP ui5
- Taobao short video, why the worse the effect
- The solution of outputting 64 bits from printf format%lld of cross platform (32bit and 64bit)
- Word document injection (tracking word documents) incomplete
- 数据湖(七):Iceberg概念及回顾什么是数据湖
猜你喜欢
Lb10s-asemi rectifier bridge lb10s
Alibaba cloud SLB load balancing product basic concept and purchase process
CloudCompare——点云切片
leetcode:221. Maximum square [essence of DP state transition]
聊聊异步编程的 7 种实现方式
无密码身份验证如何保障用户隐私安全?
Overflow toolbar control in SAP ui5 view
Flutter 绘制波浪移动动画效果,曲线和折线图
How to realize batch sending when fishing
Pandora IOT development board learning (HAL Library) - Experiment 7 window watchdog experiment (learning notes)
随机推荐
mysql econnreset_Nodejs 套接字报错处理 Error: read ECONNRESET
MySQL splits strings for conditional queries
RHCSA8
同事半个月都没搞懂selenium,我半个小时就给他整明白!顺手秀了一波爬淘宝的操作[通俗易懂]
Setting up sqli lab environment
Navigation property and entityset usage in SAP segw transaction code
使用Dom4j解析XML
Pandora IOT development board learning (HAL Library) - Experiment 7 window watchdog experiment (learning notes)
APICloud Studio3 WiFi真机同步和WiFi真机预览使用说明
RHCSA3
ASEMI整流桥HD06参数,HD06图片,HD06应用
JXL notes
Taobao product details API | get baby SKU, main map, evaluation and other API interfaces
Asemi rectifier bridge hd06 parameters, hd06 pictures, hd06 applications
MySQL giant pit: update updates should be judged with caution by affecting the number of rows!!!
关于 Notion-Like 工具的反思和畅想
使用 jMeter 对 SAP Spartacus 进行并发性能测试
跨平台(32bit和64bit)的 printf 格式符 %lld 输出64位的解决方式
About the single step debugging of whether SAP ui5 floating footer is displayed or not and the benefits of using SAP ui5
##无监控,不运维,以下是监控里常用的脚本监控