题目
统计一个数字在排序数组中出现的次数。
思路
因为题目提到有序,所以使用二分查找效率会更高,通过二分找出最开始的一个位置和最后一个位置,再求差
实现
public class Solution {
//有序,用二分查找,找出最开始一个和最后一个然后求差值
public int GetNumberOfK(int [] array , int k) {
if(array==null||array.length==0) return 0;
int first=findFirst(array,0,array.length-1,k);
int last=findLast(array,0,array.length-1,k);
if(first==-1&&last==-1) return 0;
return last-first+1;
}
public int findFirst(int[] array,int start,int end,int key){
if(start>end) return -1;
int mid=(start+end)/2;
if(array[mid]>key){
return findFirst(array,start,mid-1,key);
}else if(array[mid]<key){
return findFirst(array,mid+1,end,key);
}else if(mid-1>=start&&array[mid-1]==key){//为了找出左边最开始的一个
return findFirst(array,start,mid-1,key);
}else{
return mid;
}
}
public int findLast(int[] array,int start,int end,int key){
if(start>end) return -1;
int mid=(start+end)/2;
if(array[mid]>key){
return findLast(array,start,mid-1,key);
}else if(array[mid]<key){
return findLast(array,mid+1,end,key);
}else if(mid+1<=end&&array[mid+1]==key){//为了找出右边最后一个
return findLast(array,mid+1,end,key);
}else{
return mid;
}
}
}