给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-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]
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] pos = {-1, -1};
if(nums == null || nums.length == 0){
return pos;
}
int L = 0;
int R = nums.length - 1;
while (L <= R) {
int mid = L + ((R - L) >>> 1);
if (nums[mid] < target) {
L = mid + 1;
} else
R = mid - 1;
}
pos[0] = L < nums.length && nums[L] == target ? L : -1; //注意索引越界判断
//System.out.println("第一次出现的位置:" + pos[0]);
if (pos[0] == -1){
return pos;
}
R = nums.length - 1;
while(L <= R){
int mid = L + ((R - L) >>> 1);
if (nums[mid] <= target){
L = mid + 1;
}else
R = mid - 1;
}
pos[1] = R >= 0 && nums[R] == target ? R : -1; //注意索引越界判断
//System.out.println("最后一次出现的位置:" + pos[1]);
return pos;
}
}
执行用时 : 1 ms, 在所有 Java 提交中击败了98.77%的用户
内存消耗 : 38 MB, 在所有 Java 提交中击败了99.44%的用户