题目描述
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Java
二分查找找第一个;
二分查找找最后一个;
class Solution {
public int search(int[] nums, int target) {
int res=0;
if(nums!=null && nums.length>0){
int first=getFirst(nums,target,0,nums.length-1);
int last=getLast(nums,target,0,nums.length-1);
if(first>-1 && last>-1)
res=last-first+1;
}
return res;
}
//二分查找找第一个
public int getFirst(int [] a, int target,int start,int end){
if(start>end)
return -1;
int mid=start+(end-start)/2;
if(a[mid]==target){
if((mid>0 && a[mid-1]!=target)|| mid==0)
return mid;
else
end=mid-1;
}else if(a[mid]>target){
end=mid-1;
}else if(a[mid]<target){
start=mid+1;
}
return getFirst(a,target,start,end);
}
//二分查找找最后一个
public int getLast(int [] a, int target,int start,int end){
if(start>end)
return -1;
int mid=start+(end-start)/2;
if(a[mid]==target){
if((mid< a.length-1 && a[mid+1]!=target)|| mid==a.length-1)
return mid;
else
start=mid+1;
}else if(a[mid]>target){
end=mid-1;
}else if(a[mid]<target){
start=mid+1;
}
return getLast(a,target,start,end);
}
}