【不熟練】知識遷移能力-數(shù)字在排序數(shù)組中出現(xiàn)的次數(shù)

數(shù)字在排序數(shù)組中出現(xiàn)的次數(shù)

題目描述

統(tǒng)計一個數(shù)字在排序數(shù)組中出現(xiàn)的次數(shù)。

public class Solution {
    /*解題思路:
    有序數(shù)組的問題,采用二分查找。找到第一個K和最后一個K,兩者的位置相減
    */
    public int GetNumberOfK(int [] array , int k) {
        int length=array.length;
        if(length==0){
            return 0;
        }
        int firstK=getFirstK(array,k,0,length-1);
        int lastK=getLastK(array,k,0,length-1);
        if(firstK!=-1&&lastK!=-1){
            return lastK-firstK+1;
        }
        return 0;
    }
    //遞歸寫法
    private int getFirstK(int [] array , int k, int start, int end){
        if(start > end){
            return -1;
        }
        int mid = (start + end) >> 1;
        if(array[mid] > k){
            return getFirstK(array, k, start, mid-1);
        }else if (array[mid] < k){
            return getFirstK(array, k, mid+1, end);
        }else if(mid-1 >=0 && array[mid-1] == k){//重點array[mid-1] == k
            return getFirstK(array, k, start, mid-1);
        }else{
            return mid;
        }
    }
    //循環(huán)寫法
    private int getLastK(int [] array , int k, int start, int end){
        int length = array.length;
        int mid = (start + end) >> 1;
        while(start <= end){
            if(array[mid] > k){
                end = mid-1;
            }else if(array[mid] < k){
                start = mid+1;
            }else if(mid+1 < length && array[mid+1] == k){//重點array[mid+1] == k
                start = mid+1;
            }else{
                return mid;
            }
            mid = (start + end) >> 1;
        }
        return -1;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容