題目:給定一個按照升序排列的整數(shù)數(shù)組 nums清寇,和一個目標值 target。找出給定目標值在數(shù)組中的開始位置和結束位置护蝶。
你的算法時間復雜度必須是 O(log n) 級別华烟。
如果數(shù)組中不存在目標值,返回 [-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,-1]妥泉;找到后椭微,分別向前、向后查找盲链,直到相鄰的數(shù)和目標數(shù)不相同赏表,此時返回向前查找時后面一個數(shù)字的下標以及向后查找時前一個數(shù)字的下標检诗。
源碼:GitHub源碼
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] arr = { -1, -1 };
int index = BinarySearch(nums, target);
if (index == -1) {
return arr;
}
int l = index - 1;
while (l >= 0 && nums[l] == target) {
--l;
}
arr[0] = l + 1;
int r = index + 1;
while (r < nums.length && nums[r] == target) {
++r;
}
arr[1] = r - 1;
return arr;
}
public int BinarySearch(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int low = 0;
int high = nums.length - 1;
while (low <= high) {
int mid = low +((high -low)>>1);
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
}