题目:
给定一个按升序排序的整数数组,找出给定目标值的起始和结束位置
运行时间复杂度O(log n),如果数组中没有目标,返回[- 1,1]。
Given an array of integers nums
sorted in ascending order, 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]
.
Input: nums = [5,7,7,8,8,10], target = 8 Output: [3,4] Input: nums = [5,7,7,8,8,10], target = 6 Output: [-1,-1]
思路:
在排好序的数组中,要找到目标值的起始和结束位置,可先二分找到数,再分别往两边找到数的边界,但是由于时间复杂度需要是logn,因此在寻找边界时,不能使用依次遍历的方式,查找边界也需用二分法
算法分为两个步骤:1)找到数组中的target存在位置;2)找到target的边界
代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] re = new int[] {-1,-1};
int start = 0;
int end = nums.length-1;
int loc = -1;
// 查找出第一个target
while(start<=end) {
int mid = (start+end)/2;
if(nums[mid]==target) {
loc = mid;
break;
}
if(nums[mid]>target) {
end = mid - 1;
}else {
start = mid + 1;
}
}
// 如果没有找到target,直接返回
if(loc == -1) {
return re;
}
// 查找左边界
if(loc==0) {
re[0] = loc;
}else {
start = 0;
end = loc-1;
while(start<=end) {
int mid = (start+end)/2;
if(nums[mid]==target) {
end = mid-1;
}else {
start = mid + 1;
}
}
if(end<0) {
re[0] = 0;
}else {
re[0] = start;
}
}
// 查找右边界
if(loc==nums.length-1) {
re[1] = loc;
}else {
start = loc + 1;
end = nums.length-1;
while(start<=end) {
int mid = (start + end)/2;
if(nums[mid]==target) {
start = mid + 1;
}else {
end = mid - 1;
}
}
if(end>nums.length-1) {
re[1] = nums.length-1;
}else {
re[1] = end;
}
}
return re;
}
}