博主简介:大一计科生,努力学习Java中!热爱写博客~预备程序媛
所属专栏:LeetCode每日一题–进击大厂
✈往期博文回顾: 【Leetcode每日一题】35.搜素插入位置|二分查找数组下标
️♂️近期目标:成为千粉小博主。
“再牛的程序员也是从小白开始,既然开始了,就全身心投入去学习技术”
♀️根据我自己的理解画的图:
class Solution {
public int[] searchRange(int[] nums, int target) {
int len=nums.length;
if(len==0){
return new int[]{-1,-1};//数组长度为0
}
int firstPosition = findFisrtPosition(nums,target);
if(firstPosition==-1){
return new int[]{-1,-1};
}
int lastPosition = findLastPosition(nums,target);
return new int[]{firstPosition,lastPosition};
}
private int findFisrtPosition(int[] nums,int target){
int left=0;
int right=nums.length-1;
while(left<right){
int mid=left+(right-left)/2;//防止溢出
if(nums[mid]>=target){
right=mid;//下一轮搜索区间为[left,mid]
}
else{
left=mid+1;
}
}
if(nums[left]!=target){//目标元素不在数组中
return -1;
}
return right;
}
private int findLastPosition(int[] nums,int target){
int left=0;
int right=nums.length-1;
while(left<right){
int mid=left+(right-left+1)/2;//防止溢出
if(nums[mid]<=target){
left=mid;//下一轮搜索区间为[mid,right]
}
else{
right=mid-1;
}
}
return left;
}
}
mid = left+(right-left+1)/2
中的+1
是不能省的!目的还是当只剩两个元素时,mid指针指向的是后一个元素,按照[left,mid-1]、[mid,right]
来分才有可能缩小区间。(避免死循环的关键)
- ♀️建立此专栏的初衷是为了监督自己每天认真刷一个题,积少成多。并把自己每次刷题的思路、收获以博文的形式分享出来,帮助更多人,以及方便后续复习。如果有兴趣的同学可以订阅此专栏,我们一起刷题,一起交流,进步和学习!专栏:LeetCode每日一题–进击大厂