给定一个按照升序排列的整数数组 nums,和一个目标值 target。
找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
*/
//方法1 线性查找
public int[] searchRange1(int[] nums, int target) {
int[] targetRange = {-1, -1};
// 寻找第一个目标
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target) {
targetRange[0] = i;
break;
}
}
// 寻找最后一目标
for (int j = nums.length - 1; j >= 0; j--) {
if (nums[j] == target) {
targetRange[1] = j;
break;
}
}
return targetRange;
}
//方法2 二分查找
public int[] searchRange2(int[] nums, int target) {
int targetRange[] = {-1, -1};
int low = 0, high = nums.length - 1, mid;
while (low <= high) {
mid = low + (high - low) / 2;
if (nums[mid] == target) {
int L = mid, R = mid;
// 找到最左边和target相等的元素
while (R + 1 < nums.length && nums[R + 1] == target)
R++;
// 找到最友边和target相等的元素
while (L - 1 >= 0 && nums[L - 1] == target)
L--;
// 若唯一,没有重复出现,则 L = R = mid未改变
targetRange[0] = L;
targetRange[1] = R;
return targetRange;
} else if (nums[mid] < target)
low = mid + 1;
else
high = mid - 1;
}
return targetRange;
}
}