给一个数组,包含了重复的数字,找出目标的左右下标,就是二分查找多加了个重复元素的条件,找到左右下标。
基本思路是,先二分查找,最后找到的话跳出,说明了找到了target,判断左右边界,接着用一个二分查找,注意这个二分查找的low、high改变条件与普通的不同,则可找到左右边界
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = { -1, -1 };
if (nums == null || nums.length == 0)
return res;
int low = 0;
int high = nums.length - 1;
int pos = 0;
while (low <= high) {
int mid = (low + high) / 2;
pos = mid;
if (nums[mid] > target)
high = mid - 1;
else if (nums[mid] < target)
low = mid + 1;
else {
break;
}
}
// 找不到直接返回
if (nums[pos] != target) {
return res;
}
// 跳出说明找到了相等的target,判断左右区间的大小
int leftHigh = 0;
int leftLow = 0;
int rightHigh = 0;
int rightLow = 0;
// 左区间下标
int leftMid = pos;
leftLow = low;
leftHigh = pos;
while (leftLow <= leftHigh) {
leftMid = (leftLow + leftHigh) / 2;
if (nums[leftMid] == target) {
leftHigh = leftMid - 1;
} else {
leftLow = leftMid + 1;
}
}
res[0] = leftLow;
// 右区间下标
int rightMid = pos;
rightHigh = high;
rightLow = pos;
while (rightLow <= rightHigh) {
rightMid = (rightLow + rightHigh) / 2;
if (nums[rightMid] == target) {
rightLow = rightMid + 1;
} else {
rightHigh = rightMid - 1;
}
}
res[1] = rightHigh;
return res;
}
}