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

 

本文參考自《劍指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)

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;
			}
		}
		return -1;
	}
}

  

收穫

  1.同53-3

  

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

相關文章
相關標籤/搜索