给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
- 用子函数,每一个子函数返回index或者-1
- nums[mid]=target的时候,要么返回mid要么更新left或者right的值
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] index=new int[2];
index[0]=searchleft(nums,target);
index[1]=searchright(nums,target);
return index;
}
//找第一个
int searchleft(int []nums,int target){
int size=nums.length;
if(size==0){
return -1;
}
int left=0;
int right=size-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]<target){
left=mid+1;
}
else if(nums[mid]>target){
right=mid-1;
}
else if((nums[mid]==target)){
if(mid==0||nums[mid-1]!=target){
return mid;
}
else{
right=mid-1;
}
}
}
return -1;
}
//找最后一个
int searchright(int[]nums,int target){
int size=nums.length;
if(size==0){
return -1;
}
int left=0;
int right=size-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]<target){
left=mid+1;
}
else if(nums[mid]>target){
right=mid-1;
}
else if(nums[mid]==target){
if(mid==size-1||nums[mid+1]!=target){
return mid;
}
else{
left=mid+1;
}
}
}
return -1;
}
}