题目:
题目链接
思路:
题目中说非递减数组,即已经按从小到大顺序排序的数组,而空间复杂度限定为O(logN),可以联想到使用二分进行解题。
我们可以进行两次二分查找(二分模版),一次找最早出现的位置,一次找最后出现的位置。当二分找到target后,不再直接返回。我们要根据找最早还是找最后进行判断,是在target左边继续找最早出现的位置or在target右边继续找最后出现的位置,每次记录找到的位置最后返回即可。
代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
// 由题目得知非递减数组,故可以进行二分查找。找到target后分别根据需求去找到target出现的第一个和最后一个位置
int first = binarySearch(nums, target, 0, nums.length - 1, true);
int last = binarySearch(nums, target, 0, nums.length - 1, false);
return new int[]{first, last};
}
public int binarySearch(int[] arr, int k, int l, int r, boolean isMin) {
int left = l;
int right = r;
int ans = -1;
while(left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == k) {
if (isMin) {
ans = mid;
right = mid - 1; //找第一次出现的位置,则从当前往前找
} else {
ans = mid;
left = mid + 1; // 找最后出现的位置,则从当前往后找
}
} else if(arr[mid] < k) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return ans;
}
}