Leetcode刷题日记(2020.06.02):面试题53-II.0~n-1中缺失的数字

题目难度:简单

题目描述:一个长度为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

 

posted @ 2020-06-02 11:05  风骚的小柴犬  阅读(235)  评论(0编辑  收藏  举报