1. 題目
一個長度爲n-1的遞增排序數組中的所有數字都是唯一的,並且每個數字都在範圍0~n-1之內。在範圍0~n-1內的n個數字中有且只有一個數字不在該數組中,請找出這個數字。
2. 解題思路
2. 1暴力法
直接遍歷0~n-1的數組,判斷0~n-1中的每個元素是否都在該排序數組中出現,返回沒出現的值。
2. 2 二分法
遇到排序數組中的搜索問題,應當第一時間想到二分法。
舉個例子,[0, 1, 2, 3, 4, 6, 7, 8],這個數組中缺的數字是5(把5看做斷點),整個數組被斷點分成了兩部分,前一部分的下標和值相等,而後一部分的值是大於下標的。所以,通過二分法找到第一個下標和值不等的位置,這個位置的下標就是所缺的值。
詳情請看 leetcode 面試題53 - II. 0~n-1 中缺失的數字(二分法,清晰圖解)
3. 代碼實現
3.1 暴力法
時間複雜度O(n2),空間複雜度S(1)。
class Solution:
def missingNumber(nums):
for i in range(len(nums)+1):
if i not in nums:
return i
3.2
時間複雜度O(log2 n),空間複雜度S(1)。
class Solution:
def missingNumber(nums):
i , j = 0, len(nums)-1
while i <= j:
mid = (i+j)//2
if nums[mid] == mid: # 表明缺失值在mid的右邊
i = mid + 1
else: # 表明缺失值在mid的左邊
j = mid - 1
return i
4. 總結
遇到排序數組中的搜索問題,應當第一時間想到二分法。
5. 參考文獻
[1] 劍指offer叢書
[2] 劍指Offer——名企面試官精講典型編程題