文章目录
1、题目描述2、解题思路3、解题代码
1、题目描述
2、解题思路
定义一个方法,该方法的功能是找出 target 在 nums 数组中的开始位置或者结束位置,该方法有一个参数 left,该参数为 true 时返回的时开始位置,false 时返回的是结束位置。
因为题目不保证 nums 数组一定存在 target,因此搜索区间为左开右闭,即初始时:左边界 lo = 0;右边界 hi = nums.length。
查找开始位置时:
1、如果 nums[mid] 大于 target,不用说,直接更新右边界为 mid;
2、当 nums[mid] == target 时,因为 nums[mid] 可能就是开始位置,于是更新右边界为 mid;
3、当结束 while 循环时,此时 lo == hi,因此直接返回 lo 即可。
查找结束位置时:
1、如果 nums[mid] 大于 target,同样直接更新右边界为 mid;
2、如果 nums[mid] 等于 target,nums[mid] 同样有可能就是结束位置,于是更新左边界为 mid + 1;
在求结束位置时,返回的值是右边界的下一位,因此要进行减一操作。
也可以把求开始位置和结束位置拆开成两个方法,更为直观。
3、解题代码
class Solution {
private int extremeInsertionIndex(int[] nums
, int target
, boolean left
) {
int lo
= 0;
int hi
= nums
.length
;
while (lo
< hi
) {
int mid
= lo
+ (hi
- lo
) / 2;
if (nums
[mid
] > target
|| (left
&& target
== nums
[mid
])) {
hi
= mid
;
} else {
lo
= mid
+ 1;
}
}
return lo
;
}
public int[] searchRange(int[] nums
, int target
) {
int[] targetRange
= {-1, -1};
int leftIdx
= extremeInsertionIndex(nums
, target
, true);
if (leftIdx
== nums
.length
|| nums
[leftIdx
] != target
) {
return targetRange
;
}
targetRange
[0] = leftIdx
;
targetRange
[1] = extremeInsertionIndex(nums
, target
, false) - 1;
return targetRange
;
}
}