【Java】 劍指offer(53-2) 0到n-1中缺失的數字


 

本文參考自《劍指offer》一書,代碼采用Java語言。

更多:《劍指Offer》Java實現合集  

題目

  一個長度為n-1的遞增排序數組中的所有數字都是唯一的,並且每個數字都在范圍0到n-1之內。在范圍0到n-1的n個數字中有且只有一個數字不在該數組中,請找出這個數字。

思路

  分析易知,數組形式如下:

  如果從頭到尾依次比較值與小標是否相等,時間復雜度為O(n),效率低。

  由於是排序數組,我們繼續考慮使用二分查找算法,結合上圖可知:

    當中間數字等於其下標時,我們在后半部分查找;

    當中間數字不等於其下標時,

    1)如果中間數字的前一個數字也不等於其下標,則在前半部分查找;

    2)如果中間數字的前一個數字等於其下標,則說明中間數字的下標即為我們所要找的數字。

 

測試算例 

  1.功能測試(缺失數字位於數組開頭、中間或者結尾)

  2.邊界值測試(數字只有0或1)

  2.特殊測試(null)

Java代碼

//題目:一個長度為n-1的遞增排序數組中的所有數字都是唯一的,並且每個數字
//都在范圍0到n-1之內。在范圍0到n-1的n個數字中有且只有一個數字不在該數組
//中,請找出這個數字。

public class MissingNumber {
    public int getMissingNumber(int[] arr) {
        if(arr==null || arr.length<=0)
            return -1;
        int low=0;
        int high=arr.length-1;
        while(low<=high) {
            int mid=(low+high)>>1;
            if(arr[mid]!=mid) {
                if(mid==0 || arr[mid-1]==mid-1)
                    return mid;
                high=mid-1;
            }else {
                low=mid+1;
            }
        }
        if(low==arr.length)
            return low;
        return -1;
    }
}

  

收獲

  1.同53-3

  

更多:《劍指Offer》Java實現合集  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM