题目难度:简单
题目描述:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
实例如下:
这道题我自己开始的分析:
我将其分为三种情况进行考虑:
a.当数组缺失的是数值0,即为第一个元素缺失;
b.当数组中缺少中间值;
c.当数组中缺少最大值,即最末位的元素
代码如下:
class Solution(object): def missingNumber(self, nums): """ :type nums: List[int] :rtype: int """ # 情况1:第一位元素缺失 if len(nums) == 1 & nums[0] == 1: return 0 # 情况二:中间值缺失 for i in range(len(nums)): if nums[i] != i: return i # 情况三,末尾元素缺失 num_list = [int(x) for x in nums] return num_list[len(num_list) - 1] + 1
执行结果如下:
虽然是一道简单题目,但是做完后,我发现,嗯,有没有那种套路啥的,或者更好的做法,于是乎,我想到了二分法,思路如下:
解题思路:
a.排序数组中的搜索问题,首先一定要想到二分法
b.本题,我们按照题目意思来看,数组可以按照以下规则划分为两个部分:
1.左子数组:nums[i]=i
2.右子数组:nums[i]≠i
c.缺失的数字等于“右子数组的首位元素”对应的索引;因此考虑使用二分法查找“右子数组的首位元素”
代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ # @Time : 2020/6/2 10:03 # @Author : ZFJ # @File : 缺失的数字.py # @Software: PyCharm """ class Solution(object): def missingNumber(self, nums): """ :type nums: List[int] :rtype: int """ i = 0 j = len(nums) - 1 while i <= j: m = (i + j) // 2 if nums[m] == m: i = m + 1 else: j = m - 1 return i