本文參考自《劍指offer》一書,代碼採用Java語言。html
更多:《劍指Offer》Java實現合集 java
一個長度爲n-1的遞增排序數組中的全部數字都是惟一的,而且每一個數字都在範圍0到n-1以內。在範圍0到n-1的n個數字中有且只有一個數字不在該數組中,請找出這個數字。算法
分析易知,數組形式以下:數組
若是從頭至尾依次比較值與小標是否相等,時間複雜度爲O(n),效率低。post
因爲是排序數組,咱們繼續考慮使用二分查找算法,結合上圖可知:測試
當中間數字等於其下標時,咱們在後半部分查找;url
當中間數字不等於其下標時,htm
1)若是中間數字的前一個數字也不等於其下標,則在前半部分查找;blog
2)若是中間數字的前一個數字等於其下標,則說明中間數字的下標即爲咱們所要找的數字。排序
測試算例
1.功能測試(缺失數字位於數組開頭、中間或者結尾)
2.邊界值測試(數字只有0或1)
2.特殊測試(null)
//題目:一個長度爲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; } } return -1; } }
1.同53-3