Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1]
.
For example,
Given [5, 7, 7, 8, 8, 10]
and target value 8,
return [3, 4]
.
给定一个有序数组(可能包含相同值)和一个目标值,找出目标值的起止下标,如果数组中不包含该目标值。则返回[-1,-1],
要求时间复杂度为O(log n)。
解题思路:可以借鉴二分查找方法,但是和二分查找还有一点不同。并不是找到目标值然后返回下标就行了。因为数组中有重复元素,目标值可能多次出现。所以分为两步
step1: 为了找到起点,先找到比目标值小但靠近目标值的元素,该元素往后一位的元素值等于目标值,则就是起点
step2:同理,若能找到起点,那么为了找到止点,先找比目标值大但最仅仅目标值的元素,该元素的前一个元素就是止点
public class Solution {
public int[] searchRange(int[] nums, int target) {
int[] range = {-1,-1};
int lower = 0, upper = nums.length, mid;
if (nums[upper - 1] < target) {
return range;
}
//搜索起点
while (lower < upper) {
mid = (lower + upper) / 2;
if (nums[mid] < target) {
//尽可能往目标值上靠近
lower = mid + 1;
}else {
//不适用mid-1,是因为要保留可能存在目标值的元素
upper = mid;
}
}
//如果目标值没找到,则返回[-1,-1]
if (nums[lower] != target) {
return range;
}
range[0] = lower;
//搜索终点
upper = nums.length;
while (lower < upper) {
mid = (lower + upper) / 2;
if (nums[mid] > target) {
//找出最靠近目标值又比目标值大的元素
upper = mid;
}else {
lower = mid + 1;
}
}
range[1] = upper-1;
return range;
}
}