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

 2023-10-08 阅读 26 评论 0

摘要:本文參考自《劍指offer》一書,代碼采用Java語言。題目一個長度為n-1的遞增排序數組中的所有數字都是唯一的,并且每個數字都在范圍0到n-1之內。在范圍0到n-1的n個數字中有且只有一個數字不在該數組中,請找出這個數字。思路分析易知,數組形式如下&#

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

題目

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

思路

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

d28830071fe95e30c2833771a75e3b7f.png

如果從頭到尾依次比較值與小標是否相等,時間復雜度為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;

}

}

收獲

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/129752.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息