題目:給定一個按照升序排列的整數(shù)數(shù)組 nums,和一個目標(biāo)值 target。找出給定目標(biāo)值在數(shù)組中的開始位置和結(jié)束位置。
你的算法時(shí)間復(fù)雜度必須是 O(log n) 級別。
如果數(shù)組中不存在目標(biāo)值,返回 [-1, -1]。
分析:其實(shí)題目意思很簡單,如果沒有時(shí)間復(fù)雜度的限制的話,最快的方法莫過于從前往后遍歷尋找第一個出現(xiàn)target的元素,若找到最后都沒有找到目標(biāo)元素則輸出[-1,-1],然后從后往前尋找第一個出現(xiàn)target的元素,兩個元素的下標(biāo)即為所求結(jié)果。
但是題目中要求時(shí)間復(fù)雜度為logn,那么我們能想到的尋找元素的方法即為二分法,但是此題二分法需要分為兩部分考慮,即尋找左邊的target以及右邊的target。
public int[] searchRange(int[] nums, int target) {
int leftIdx = findLeftIdx(nums,target);
int rightIdx = findRightIdx(nums,target);
int[] result = {-1,-1};
if (leftIdx == nums.length || nums[leftIdx] != target) {
return result;
}
result[0] = leftIdx;
result[1] = rightIdx-1;
return result;
}
public int findLeftIdx(int[] nums,int target){
int low = 0;
int high = nums.length;
while (low < high){
int mid = (low + high)/2;
if(nums[mid] >= target){
high = mid;
}
else
low = mid + 1;
}
return low;
}
public int findRightIdx(int[] nums,int target){
int low = 0;
int high = nums.length;
while (low < high){
int mid = (low+high)/2;
if(nums[mid] > target){
high = mid;
}
else
low = mid + 1;
}
return low;
}