一开始题目没看明白,测试用例出现了个[0]期望输出为1给我看懵了。
关键问题在于“一个长度为n-1的递增排序数组”、“范围0~n-1内的n个数字”,比如[0]这个例子,长度为1,也就是n=2,它应该包含0-n-1也就是0-1两个数字。所以这个这个题目和例子就很狡猾。
原创但遍历版本。因为最后一个元素有时候会发生数组越界,所以尝试用了try:
class Solution(object):
def missingNumber(self, nums):
n=len(nums)
for i in range(0,n+1):
try:
if nums[i]==i:
continue
else:
return i
except Exception:
return i
去掉try:
class Solution(object):
def missingNumber(self, nums):
n=len(nums)
i=0
while i<n:
if nums[i]==i:
i=i+1
continue
if nums[i]!=i:
return i
return i
遍历简单不过脑,刷题还是要好好想方法才行哇。
二分法的思路是这样的,把数组分为左子数组和右子数组,左子数组是正常的,nums[i]=i的,右子数组是已经发生了错位的,nums[i]!=i的。目标是找出右子数组的第一个元素。
当中间值nums[m]=m时,说明左边的数组元素都没问题,需要找到元素在右边。
当中间值nums[m]!=m时,说明错位已经发生,需要找到元素在左边。
以下是代码:
class Solution:
def missingNumber(self, nums):
i, j = 0, len(nums) - 1
while i <= j:
m = (i + j) // 2
if nums[m] == m: i = m + 1
else: j = m - 1
return i