标签:load 第一个 有序数组 描述 个数 get last 排序数组 有序
题目描述:
解题思路:
仍然是有序数组,考虑使用二分法
- 首先用二分法判断第一个target的index值。
- nums[mid] == target: 和之前不同的是,这个不一定是第一个target,因此要向左继续寻找
- nums[mid] < target:向右寻找
- nums[mid] > target:向左寻找
- 用二分法判断最后一个target的index值
- nums[mid] == target: 和之前不同的是,这个不一定是最后一个target,因此要向右继续寻找
- nums[mid] < target:向右寻找
- nums[mid] > target:向左寻找
这里要注意的是:返回的left或者right可能会出现越界的情况,要加以判断。
代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums.length == 0){
return new int[]{-1,-1};
}
int first = binarySearchFirst(nums,target);
if(first > nums.length - 1 || nums[first] != target){
return new int[]{-1,-1};
}
//如果找到了第一个值,那么一定会有最后一个值
int last = binarySearchLast(nums,target);
return new int[]{first,last};
}
public int binarySearchFirst(int[] nums,int target){
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = (left +right) / 2;
if(nums[mid] == target){
//不一定是第一个target值,继续向左查找
right = mid - 1;
}
if(nums[mid] < target){
//向右寻找
left = mid + 1;
}
if(nums[mid] > target){
//向左寻找
right = mid - 1;
}
}
return left;//这里left,如果有目标值target一定是第一个,如果没有target,则返回target右边一个数
}
public int binarySearchLast(int[] nums,int target){
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = (left +right) / 2;
if(nums[mid] == target){
//不一定是最后个target值,继续向右查找
left = mid + 1;
}
if(nums[mid] < target){
//向右寻找
left = mid + 1;
}
if(nums[mid] > target){
//向左寻找
right = mid - 1;
}
}
return right;//这里right,如果有目标值target一定是最后一个,如果没有target,则返回target左边一个数
}
}
标签:load 第一个 有序数组 描述 个数 get last 排序数组 有序
原文地址:https://www.cnblogs.com/forrestyu/p/14675425.html