劍指offer系列-面試題- 53- 2 - 0~n-1中缺失的數字 (python)

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——名企面試官精講典型編程題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章