排序数组中,当相等时,需要区分第一次还是最后一次出现。
1.第一次:mid==0或者nums[mid-1]<nums[mid]
2. 最后一次出现: mid==nums.length-1或者nums[mid]<nums[mid+1]
需要分两次,不能同时找出第一次和最后一次。因为那时当相等时,就不知道如何移动了!!
首先要存在,然后再谈第一次和最后一次。
/**
* 统计一个数字在升序数组中出现的次数。
* @param array 升序数组
* @param k 数字
* @return 出现的次数
*/
public int GetNumberOfK(int [] array , int k) {
int res=0;
if(array==null||array.length==0){
return 0;
}
int first=getFirstK(array,k);
int last=getLastK(array,k);
if(first>-1&&last>-1){
res=last-first+1;
}
return res;
}
public int getFirstK(int[] array,int k){
int start=0,end=array.length-1;
while (start<=end){
int mid=start+(end-start)/2;
if(array[mid]<k){
start=mid+1;
}else if(array[mid]>k){
end=mid-1;
}else {
//相等
if(mid==0||array[mid-1]<array[mid]){
return mid;
}else {
end=mid-1;
}
}
}
return -1;
}
public int getLastK(int[] array,int k){
int start=0,end=array.length-1;
while (start<=end){
int mid=start+(end-start)/2;
if(array[mid]<k){
start=mid+1;
}else if(array[mid]>k){
end=mid-1;
}else {
//相等
if(mid==array.length-1||array[mid]<array[mid+1]){
return mid;
}else {
start=mid+1;
}
}
}
return -1;
}