一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
二分查找突破的关键是,如果某个值缺失了,那么其后面的值求mid就无法与数组中的mid位置的值对应上。如果是对的,可以对应上,就往后缩小范围;如果是错的,往前缩小范围。
class Solution(object): #三种方法
def missingNumber(self, nums):
min = 0
max = len(nums)-1
mid = (max + min)//2
while min <=max:
if mid != nums[mid]:
max = mid -1
else:
min = mid +1
mid = (max + min)//2
return max+1
也是二分:这种比较好理解,补全之后,就跟原来的数组可以对应上,如果是中值之后的缺失,那么中值肯定可以对应上;如果是中值之前的,那么缺失值就有可能是中值及之前的值。(继续缩小范围)到最后如果不符合判断条件了,仍然对应不上,那么就是缺失了最终的中值。
def missingNumber(self, nums):
if not nums:
return
min = 0
max = len(nums) # 加了一个,补全
mid = (max + min)//2
while min < max:
if mid == nums[mid]:
min = mid + 1
else:
max = mid
mid = (max + min)//2
return mid
公式的方法,算总的,依次减去
class Solution(object):
def missingNumber(self, nums):
n = len(nums)+1
a = (0+n-1)*n/2
for i in range(0, n-1):
a -= nums[i]
return a