剑指offer系列-面试题- 53- 2 - 0~n-1中缺失的数字 (python)

文章目录

  • 1. 题目
  • 2. 解题思路
    • 2. 1暴力法
    • 2. 2 二分法
  • 3. 代码实现
    • 3.1 暴力法
    • 3.2
  • 4. 总结
  • 5. 参考文献

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——名企面试官精讲典型编程题

你可能感兴趣的:(算法)