(一)题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
(二)思路分析
此题不难,要节省时间的话就用二分查找法,查找到target后往其对应的下标两侧分散开来继续查找,直到找到值不为target的数。
(三)代码如下
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = {-1, -1};
int len = nums.length;
//特殊数组的处理
if (len == 0) {
return res;
}
if (len == 1 && nums[0] != target) {
return res;
}
int left = 0;
int right = len - 1;
//以下为二分法的基本模板
while (left <= right) {
int mid = (left + right) / 2;
//当找到target后,需要向该元素位置的两边分散,查找该元素
if (nums[mid] == target) {
int l = mid - 1;
int r = mid + 1;
//向左边找
while (l >= 0 && nums[l] == nums[mid]) {
l--;
}
//向右边找
while (r < len && nums[r] == nums[mid]) {
r++;
}
res[0] = l + 1;
res[1] = r - 1;
return res;
}
if (target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return res;
}
}