题目链接:34.在排序数组中查找第一个和最后一个位置(中等)
算法思路:
击败100.00%
时间复杂度O(logn)
求最右端点:
思路:(注意:mid在最右端的右边的情况是自己分析的)
1.分二段,发现左有 右无=—>右无=就求右端点
2.注意mid靠右:mid=left+(right-left+1)/2
3.if(mid在最右端点的右边)让右端点的右边往里靠,还要超过:right=mid-1
4.else 另一边靠过来就行:left=mid
5.返回left或者right都行(因为最终会重合)
注意:分层递增时求最右端的右边要小于左边的最小值,而非右边最大值
求最左端点:
思路:(注意:mid在最左端的左边的情况是自己分析的)
1.分二段,发现左无= 右有 —>左无=就求左端点
2.注意mid靠左:mid=left+(right-left)/2
3.if(mid在最左端点的左边)让左端点的左边往里靠,还要超过:left=mid+1
4.else 另一边靠过来就行:right=mid
5.返回left或者right都行(因为最终会重合)
Java代码:
/**
* Created with IntelliJ IDEA.
* Description:
* User: 王洋
* Date: 2025-08-27
* Time: 23:27
*/
class Solution {
//34. 在排序数组中查找元素的第一个和最后一个位置
/*给你一个按照非递减顺序排列的整数数组 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]
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109*/
public int[] searchRange(int[] nums, int target) {
int[] ret=new int[2];
ret[0]=ret[1]=-1;
//处理边界情况
if(nums.length==0) return ret;
//1.二分左端点:找该元素的第一个位置
int left=0,right=nums.length-1;
while(left<right){
int mid=left+(right-left)/2;
//找左端点
//求左端点mid要靠左:left+(right-left)/2;
//当mid在实际左端点的左边时,left往mid上靠,而且要超过,否则死循环 left=mid+1;
//right靠紧mid:right=mid;
if(nums[mid]<target) left=mid+1;
else right=mid;
}
//判断是否有结果
if(nums[left]==target) ret[0]=left;
//2.二分右端点:找该元素的最后一个位置
right=nums.length-1;
while(left<right){
int mid=left+(right-left+1)/2;
//找左端点
//求左端点mid要靠左:left+(right-left)/2;
//当mid在实际左端点的左边时,left往mid上靠,而且要超过,否则死循环 left=mid+1;
//right靠紧mid:right=mid;
if(target<nums[mid]) right=mid-1;
else left=mid;
}
if(nums[left]==target) ret[1]=left;
return ret;
}
}


被折叠的 条评论
为什么被折叠?



