題目描述:統計一個數字在排序數組中出現的次數。
public class Solution {
/*
思路1:看到排序數組就想到二分法查找,當查找到數字K,再向左右順序遍歷,找到第一個和
最後一個K,然後計算個數,但是K可能出現O(N)次,所以和從頭到尾的遍歷是一樣的
時間複雜度;
思路2:那麼我們可以直接用二分查找法直接找到第一個和最後一個K
一下是思路2的實現
*/
public int GetNumberOfK(int [] array , int k) {
if(array == null || array.length == 0){
return 0;
}
int first = GetFirstK(array,k,0,array.length-1);
int last = GetLastK(array,k,0,array.length-1);
return (last-first+1);
}
public int GetFirstK(int [] array , int k, int begin , int end ) {
if(begin > end){
return 0;
}
int meddle = (begin + end)/2;
if(array[meddle] > k){
return GetFirstK(array , k, begin , meddle-1 );
}
else if(array[meddle] < k){
return GetFirstK(array , k, meddle+1 ,end);
}
else{
if((meddle-1)<0 || array[meddle-1] != k){
return meddle;
}
else{
return GetFirstK(array , k, begin , meddle-1);
}
}
}
public int GetLastK(int [] array , int k, int begin , int end ) {
if(begin > end){
return -1;
}
int meddle = (begin + end)/2;
if(array[meddle] > k){
return GetLastK(array , k, begin , meddle-1 );
}
else if(array[meddle] < k){
return GetLastK(array , k, meddle+1 ,end);
}
else{
if((meddle+1)==array.length || array[meddle+1] != k){
return meddle;
}
else{
return GetLastK(array , k, meddle+1 ,end);
}
}
}
}