給你一個按照非遞減順序排列的整數陣列 nums
,和一個目標值 target
。請你找出給定目標值在陣列中的開始位置和結束位置。
如果陣列中不存在目標值 target
,返回 [-1, -1]
。
你必須設計並實現時間複雜度為 O(log n)
的演算法解決此問題。
// 兩次二分查詢,分開查詢第一個和最後一個
// 時間複雜度 O(log n), 空間複雜度 O(1)
// [1,2,3,3,3,3,4,5,9]
public int[] searchRange2(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int first = -1;
int last = -1;
// 找第一個等於target的位置
while (left <= right) {
int middle = (left + right) / 2;
if (nums[middle] == target) {
first = middle;
right = middle - 1; //重點
} else if (nums[middle] > target) {
right = middle - 1;
} else {
left = middle + 1;
}
}
// 最後一個等於target的位置
left = 0;
right = nums.length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (nums[middle] == target) {
last = middle;
left = middle + 1; //重點
} else if (nums[middle] > target) {
right = middle - 1;
} else {
left = middle + 1;
}
}