题目描述:
解题思路:
一开始用暴力写了,没注意到题目要 O(log n),然后这道题一看复杂度,而且是有序的,就要想到二分。但是这道题要考虑开始位置和结束位置不同二分,也就是找左边界的时候,要找到最左边,就是当mid等于target的时候,也要继续向左找,相反,对于右边界也是一样。
这里注意一下二分的坑,就是需要注意mid的下取整,mid要变成int mid = left + (right - left + 1) / 2;这里需要多调试才能有熟练。
可以去看liweiwei的视频更好理解
参考代码:
public static int[] searchRange(int[] nums, int target) {
int len = nums.length;
if (len == 0) {
return new int[]{-1, -1};
}
int firstPosition = FindFirstPosition(nums, target);
if (firstPosition == -1) {
return new int[]{-1, -1};
}
int lastPosition = FindLastPosition(nums, target);
return new int[]{firstPosition, lastPosition};
}
private static int FindFirstPosition(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = (right - left) / 2 + left;
if (nums[mid] < target) {
left = mid + 1;
} else//大于或者等于target的就向左边更新
{
right = mid;
}
}
if (nums[left] == target)
return left;
return -1;
}
private static int FindLastPosition(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = left + (right - left + 1) / 2;
if (nums[mid] > target) {
right = mid - 1;
} else {//小于于或者等于target就向右边去更新
left = mid;
}
}
return left;
}