思路:二分查找第一个出现和最后一个出现的位置,相减得出结果。
public int findNumTimes(int[] arr ,int num){
if(arr == null
|| arr.length == 0
|| num<arr[0]
|| num>arr[arr.length-1]){
return 0;
}
int indexFirst = findKey(arr, num, true);
if(indexFirst<0){
return 0;
}
int indexLast = findKey(arr, num, false);
return indexLast - indexFirst + 1;
}
//flag: true 第一次出现,false 最后一次出现
public int findKey(int[] arr, int num, boolean flag){
int left = 0, right = arr.length-1, mid = 0;
if(arr[0] == num && flag){
return 0;
}
if(arr[arr.length-1] == num && !flag){
return arr.length-1;
}
while(left<=right){
mid = (left+right)/2;
if(flag){
if(mid-1>=0 && arr[mid]==num && arr[mid-1]<num){
return mid;
}
if(arr[mid]==num || arr[mid]>num){
right=mid-1;
}else{
left = mid+1;
}
}else{
if(mid+1<arr.length && arr[mid]==num && arr[mid+1]>num){
return mid;
}
if(arr[mid]==num || arr[mid]<num){
left=mid+1;
}else{
right = mid-1;
}
}
}
return -1;
}