劍指Offer——數字在排序數組中出現的次數

題目描述:統計一個數字在排序數組中出現的次數。

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);
            }
        }
    }
}

發佈了56 篇原創文章 · 獲贊 163 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章