給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。
你的算法時間複雜度必須是 O(log n) 級別。
如果數組中不存在目標值,返回 [-1, -1]。
來源:力扣(LeetCode)
上代碼:
public static void main(String[] ar) {
int[] nums = {1};
int[] result = searchRange1(nums, 1);
}
/**
* 二分法
* @param nums
* @param target
* @param fristOne 是否第一個命中
* @return
*/
public static int searchRangeLeft(int[] nums, int target, boolean fristOne) {
int arrLen = nums.length;
int left = 0;
int right = arrLen;
while (left < right) {
int middle = (left + right) / 2;
int middleNum = nums[middle];
if (target == middleNum) {
if (fristOne) {
//命中第一個 退出循環
right = middle;
} else {
//往右邊找 是否還有其他相同的 要最後一個
left = middle + 1;
}
} else if (target > middleNum) {
left = middle + 1;
} else {
right = middle;
}
}
return left;
}
public static int[] searchRange1(int[] nums, int target) {
int[] result = {-1,-1};
int left = searchRangeLeft(nums, target, true);
if (nums.length > left && nums[left] == target) {
//查找右邊最後一個
int right = searchRangeLeft(nums, target, false)-1;
if (nums[left] == target) {
result = new int[]{left, right};
} else {
result = new int[]{left, left};
}
}
return result;
}