Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.
Your algorithm’s runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
思路
二分搜索
本来以为二分搜索是很简单得但是这道题彻底把我搞晕了
本题思路为用两个二分查找分别找出第一个值和最后一个值
在判断第一个值时
如果mid》=target,因为要判断他最左边得第一个值所以end -mid
判断最后一个值时则相反nums[mid] <=target start = end;
让我头晕的是
在二分搜索完成后对res进行赋值
第一个数为
if(nums[end] ==target){
res[0] = end;
}
if(nums[start] ==target){
res[0] = start;
}
为什么先判断end?在我想法中start比end更考前为什么不判断start先?
判断最后一个数时为什么不先判断end而先判断first?
如果按我所想的得修改在submit后会卡在例子【2,2】
经过修改我把顺序调整后加了else也可以ac所以问题在哪呢?
if(nums[end] ==target){
res[0] = end;
}
if(nums[start] ==target){
res[0] = start;
}
仔细想了想发现时if 和 else if 得问题
如果没有else 则 第一二个if互不影响则判断完第一个if 第二个接着判断导致值为后一个的值
而加上else之后便判断成功后不再继续判断
class Solution {
public int[] searchRange(int[] nums, int target) {
int [] res =new int[]{-1,-1};
if(nums ==null|| nums.length ==0){
return new int[]{-1,-1};
}
int start =0,end=nums.length-1;
while(start+1<end){//判断第一个位置
int mid = (end - start)/2+start;
if(nums[mid]>=target) {
end = mid;
}
else{
start =mid;
}
}
if(nums[end] ==target){
res[0] = end;
}
if(nums[start] ==target){
res[0] = start;
}
start =0;
end=nums.length-1;
while(start+1<end){//盘断最后一个的位置
int mid = (end-start)/2 + start;
if(nums[mid] <=target){
start =mid;
}
else{
end =mid;
}
}
if(nums[start] ==target){
res[1] = start;
}
if(nums[end] ==target){
res[1] = end;
}
return res;
}
}