LeetCode 学习:消失的数字类小结

题目回顾

1.缺失数字

LeetCode 学习:消失的数字类小结_第1张图片
方法1:【0-N】N个数,不重复
利用加法的性质

方法2:
利用负号,原地哈希
整体向右平移1个单位,转化为【1,N】的问题。
同理,如果是从负数开始的,也可以通过平移来转换。

x-y是一 一对应的映射关系,且是线性关系,所以可以进行平移。

2. 缺失2个数字

LeetCode 学习:消失的数字类小结_第2张图片
【1,N】 N个数
不重复
利用加法、乘法性质,结合一元二次方程

3. 找出所有缺失数字

LeetCode 学习:消失的数字类小结_第3张图片
【1,N】N个数,
有重复
利用负号,原地哈希

4. 缺失的第一个正数

LeetCode 学习:消失的数字类小结_第4张图片
长度未知,范围未知
可能有重复
利用已知元素替换不符合要求的元素
利用负号,原地哈希。


延申作业:

1. 缺失1个数,缺失2个数,分别用原地哈希做一下

a.缺失1个数:

https://leetcode-cn.com/problems/first-missing-positive/
LeetCode 学习:消失的数字类小结_第5张图片
错误版本

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        # 转换为从1到n+1
        for index,data in enumerate(nums):
            nums[index] = data +1

        
        # 利用索引作为哈希表
        for  index,data in enumerate(nums):
            nums[abs(i)-2] = -nums[abs(i)-2]

        
        # 找出第一个保存正整数的
        for  index,data in enumerate(nums)::
            if data > 0:
                return index+1-1
        
        return len(nums)+1-1

LeetCode 学习:消失的数字类小结_第6张图片
错误原因分析:如果使用索引作为哈希表,是默认不需要检索0的,所以首先应当确认0元素是否存在,然后再去利用索引作为哈希表。

正确版本

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        if 0 not in nums:
            return 0
        # 转换为从1到n+1
        for index,data in enumerate(nums):
            nums[index] = data +1

        
        # 利用索引作为哈希表
        for  i in nums:
            if 0<abs(i)<len(nums)+1 and nums[abs(i)-1]>0:
                nums[abs(i)-1] = -nums[abs(i)-1]

        
        # 找出第一个保存正整数的
        for i in range(1,len(nums)):
            if nums[i] > 0:
                return i+1-1
        
        return len(nums)+1-1

在这里插入图片描述

b.缺失两个数

https://leetcode-cn.com/problems/missing-two-lcci/
LeetCode 学习:消失的数字类小结_第7张图片

class Solution:
    import math

    def missingTwo(self, nums: List[int]) -> List[int]:
        max_num = len(nums)+2
        miss_num=[]

        if len(nums)+1 not in nums:
            miss_num.append(len(nums)+1)
        if len(nums)+2 not in nums:
            miss_num.append(len(nums)+2)

        if len(miss_num) ==2:
            return miss_num

        # 利用索引作为哈希表
        for  i in nums:
            if 0<abs(i)<len(nums)+1 and nums[abs(i)-1]>0:
                nums[abs(i)-1] = -nums[abs(i)-1]
        # return nums
        # 找出第一个保存正整数的
        for i in range(len(nums)):
            if nums[i] > 0:
                miss_num.append(i+1) 
                
        return miss_num

在这里插入图片描述

2. [1,N] 的数列中,缺失k个数字。

采用k=2验证。

class Solution:
    import math

    def missingTwo(self, nums: List[int]) -> List[int]:
        k=2
        max_num = len(nums)+k
        miss_num=[]


        for i in range(1,k+1):
            if len(nums)+i not in nums:
                miss_num.append(len(nums)+i)

        if len(miss_num)==k:
            return miss_num
        
        # 利用索引作为哈希表
        for  i in nums:
            if 0<abs(i)<len(nums)+1 and nums[abs(i)-1]>0:
                nums[abs(i)-1] = -nums[abs(i)-1]

        # 找出第一个保存正整数的
        for i in range(len(nums)):
            if nums[i] > 0:
                miss_num.append(i+1) 
                
        return miss_num

在这里插入图片描述

师父总结
消失的数字的核心要点就是看所在容器的范围是多少,不在里面的,先通过循环判断一下,然后再用原地哈希。

你可能感兴趣的:(LeetCode 学习:消失的数字类小结)