一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
限制:
1 <= 数组长度 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof
先写的暴力遍历前后两个数,但需要考虑一些边界情况,如缺失的数是最左边的0,或最右边的数len(nums)
class Solution:
def missingNumber(self, nums: List[int]) -> int:
lens = len(nums)
if nums[0]!=0: #缺最左边0的情况
return 0
if lens==1: #因为我的循环从1开始,先处理[0]缺1这种情况
return 1
for i in range(1,lens):
if nums[i]!=nums[i-1]+1:
return i
return i+1 #缺最右边len(nums)的情况
写了这个代码以后发现这种暴力太费事儿了,这个题不就是判断值是不是等于它的索引值吗,换个暴力:
class Solution:
def missingNumber(self, nums: List[int]) -> int:
lens = len(nums)
for i in range(lens):
if i!=nums[i]:
return i
return i+1
所谓有序所以二分,一开始想二分以后判断前半段和后半段是不是等于它们该有的长度,后来想到索引这回事以后感觉根本不用那么麻烦,直接二分后判断中间值是否等于索引就行了,等的话说明左边不缺,右边缺,不等的话说明左边缺,右边不缺。一直缩小查找范围,当左指针等于右指针时,退出循环,该指针就是缺失值。
class Solution:
def missingNumber(self, nums: List[int]) -> int:
lens = len(nums)
l = 0
r = lens
while l<r:
mid = (l+r)>>1
if nums[mid]==mid:
l=mid+1
else:
r = mid
return l
不过不知道为什莫我这个代码效率不高