题意:给定一个有序数组和一个target数,找出target在数组中的第一个和最后一个位置
思路:
- 第一次二分查找,找到比target大的最小数字的位置
- 第二次二分查找,找到比target小的最大数字的位置
- 以上两次二分查找的两个数字的前一个位置即为所求
思想:二分查找
复杂度:时间O(lgn),空间O(1)
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = new int[2];
res[0] = -1;
res[1] = -1;
int l = 0;
int len = nums.length;
int r = len-1;
if(len == 0)
return res;
// 二分查找找到数组右边>target的最小的index
while(l<r) {
int m = l + (r-l)/2;
if(nums[m]<=target) {
l = m+1;
} else {
r = m;
}
}
// 如果数组的第一个元素大于target或者比target大的最小index的前一个数字不是target,说明target不在数组中
if(nums[r] != target && (r == 0 || nums[r-1] < target))
return res;
// 数组最后一个字符是target
if(nums[r] == target)
res[1] = r;
// 数组最后一个字符不是target
else
res[1] = r-1;
l = 0;
// 二分查找找到数组左边<target的最小的index
while(l<r) {
int m = l + (r-l)/2;
if(nums[m] < target) {
l = m + 1;
} else {
r = m;
}
}
// 第一个数字是target
if(nums[l] == target)
res[0] = l;
// 第一个数字不是target
else
res[0] = l+1;
return res;
}
}
网友评论