题目链接
class Solution {
public int[] searchRange(int[] nums, int target) {
// count记录数组中与target相等的个数
int count = 0;
// index记录最后一个与target相等的数组下标,先赋值-1证明没有与之相等的数组元素
int index = -1;
// 返回数组arr
int[] arr = new int[]{-1,-1};
for(int i = 0;i<nums.length;i++){
if(nums[i]==target){
count++;
index = i;
}
}
// index = -1证明数组nums中没有与target相等的元素
if(index == -1){
return arr;
}else{
arr[0] = index - count + 1;
arr[1] = index;
return arr;
}
}
}
非常粗暴的解法,实在没想到怎么用二分查找,时间复杂度没达到O(logn),学习一下答案的优解!!
官方答案
两次二分查找O(logn),先找最小的index,再找最大的index。
class Solution {
public int[] searchRange(int[] nums, int target) {
// 获取左侧最小下标
int leftIdx = binarySearch(nums, target, true);
// 获取右侧最大下标
int rightIdx = binarySearch(nums, target, false) - 1;
// 当nums中存在target时
if (leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx] == target && nums[rightIdx] == target) {
return new int[]{leftIdx, rightIdx};
}
return new int[]{-1, -1};
}
public int binarySearch(int[] nums, int target, boolean lower) {
int left = 0, right = nums.length - 1, ans = nums.length;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
} else {
left = mid + 1;
}
}
return ans;
}
}
我也想到了两次二分查找!!!!!但我发现做算法题的时候就是不会写多个函数调用,就想一个函数解决,咋也没写出来,代码一级残废🙂