题目
给你一个按照非递减顺序排列的整数数组 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]
题解
class Solution {
public int[] searchRange(int[] nums, int target) {
int start = lower_bounds(nums, target);
if (start == nums.length || nums[start] != target) {
//返回长度或者找不到目标值
return new int[]{-1,-1};
}
//结束位置相当于满足条件>target的前一个数
int end = lower_bounds(nums, target + 1) - 1;
return new int[]{start,end};
}
private int lower_bounds(int[] nums, int target) {
//闭区间写法二分
int n = nums.length;
int left = 0;
int right = n - 1;
while(left <= right) { //保证区间不为空 查找最后一个元素
int mid = left + (right - left)/2;
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left; //返回值也可以写right+1
}
}
二分查找算法寻找整数数组中目标值的范围
文章描述了一个使用二分查找方法在非递减整数数组中找到目标值及其范围的问题,保证了时间复杂度为O(logn)。解决方案包括lower_bounds辅助函数进行二分查找确定目标值的位置。

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



