题目

image.png
https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/

思路

数组已经排序,且唯一,找出缺失的数字,那么遍历一遍,比较索引与当前值,即可知道缺失的数字。

  1. class Solution:
  2. def missingNumber(self, nums: List[int]) -> int:
  3. for i, val in enumerate(nums):
  4. if i == val:
  5. continue
  6. else:
  7. return i
  8. return len(nums)

这样算法时间复杂度是O(n)。

看到数组是有序的或者部分有序,那么考虑是否可以用二分查找。只要索引 i== cur_val,那么说明前i个元素是已经严格从小到大依次排序。详见代码

  1. class Solution:
  2. def missingNumber(self, nums: List[int]) -> int:
  3. # 二分法
  4. if nums[-1] < len(nums): return len(nums)
  5. if nums[0] > 0: return 0
  6. left, right = 0, len(nums) - 1
  7. while left + 1 < right:
  8. mid = left + (right - left) // 2
  9. if nums[mid] == mid:
  10. # 说明前mid都是依次排序的
  11. left = mid + 1
  12. else:
  13. right = mid
  14. return left if nums[left] != left else right