题目描述
统计一个数字在排序数组中出现的次数。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array==null || array.length<=0) return 0;
int first = getFirst(array,k);
int last = getLast(array,k);
if(first==-1 && last==-1) return 0;
if(first==-1 || last==-1) return 1;
return (last-first+1);
}
public int getFirst(int[] array, int k){
int low = 0;
int high = array.length-1;
while(low<=high){
int mid = (low+high)/2;
if(array[mid]>k){
high = mid-1;
}else if(array[mid]<k){
low = mid+1;
}else{
if((mid-1)>=0 && array[mid-1]==k){
high = mid-1;
}else{
return mid;
}
}
}
return -1;
}
public int getLast(int[] array, int k){
int low = 0;
int high = array.length-1;
int length = array.length;
while(low<=high){
int mid = (low+high)/2;
if(array[mid]>k){
high = mid-1;
}else if(array[mid]<k){
low = mid+1;
}else{
if((mid+1)<length && array[mid+1]==k){
low = mid+1;
}else{
return mid;
}
}
}
return -1;
}
}
思路:只需要找到这个数字在数组中第一次出现的地方和最后一次出现的地方即可,那怎么找到第一次出现的位置,和正常的查找一样,只不过在数字当查找到一个的时候,这个时候查看该位置的前一个位置是否还是等于这个数字,如果是的话,则继续在该位置的前一个位置为结束点的前半段查找,知道找的的位置的前一个数字不等于该数字,返回即可,同理查找最后一个数字也如此