• LeetCode-268(Python)—— 丢失的数字


    丢失的数字

    概述:给定一个包含 [0, n] n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

    1. 输入:nums = [3,0,1]
    2. 输出:2
    3. 输入:nums = [0,1]
    4. 输出:2
    5. 输入:nums = [9,6,4,2,3,5,7,0,1]
    6. 输出:8
    7. 输入:nums = [0]
    8. 输出:1

    方法一:暴力循环

    思路:简化思路,缺失数字为一个,所以总长度为 len(nums) + 1。然后暴力循环判断是否在原列表里面即可。

    1. # 暴力循环
    2. # 简化思路,缺失数字为一个,所以总长度为 len(nums) + 1。
    3. # 然后暴力循环判断是否在原列表里面即可。
    4. class Solution:
    5. def missingNumber(self, nums: List[int]) -> int:
    6. for num in range(len(nums) + 1):
    7. if num not in nums:
    8. return num

    方法二:排序+if大法

    思路:此算法的精髓在于排序,对于头尾缺失情况直接返回即可。但是若中间缺失的话,前后依次相减,找到等于 2 的位置的值。

    1. # 排序+if大法
    2. # 此算法的精髓在于排序,对于头尾缺失情况直接返回即可。
    3. # 但是若中间缺失的话,前后依次相减,找到等于2的位置的值。
    4. class Solution:
    5. def missingNumber(self, nums: List[int]) -> int:
    6. nums.sort()
    7. if nums[-1] == len(nums) and nums[0] == 0:
    8. nums_new = [nums[i+1] - nums[i] for i in range(len(nums) - 1)]
    9. return nums_new.index(2) + 1
    10. if nums[-1] != len(nums):
    11. return nums[-1] + 1
    12. if nums[0] != 0:
    13. return 0

    方法三:排序(优化版)

    思路:排序以后,用 enumerate() 方法枚举列表,如果位置不等于值,返回即可。

    1. # 排序(优化版)
    2. # 排序以后,用 enumerate() 方法枚举列表,如果位置不等于值,返回即可。
    3. class Solution:
    4. def missingNumber(self, nums: List[int]) -> int:
    5. nums.sort()
    6. for i,v in enumerate(nums):
    7. if i != v:
    8. return i
    9. return len(nums)

    方法四:哈希集合

    思路:set() 集合的特点是有序不重复,依次判断返回即可。

    1. # 哈希集合
    2. # set() 集合的特点是有序不重复,依次判断返回即可。
    3. class Solution:
    4. def missingNumber(self, nums: List[int]) -> int:
    5. nums_s = set(nums)
    6. for i in range(len(nums) + 1):
    7. if i not in nums_s:
    8. return i

    方法三:高斯求和

    思路:数列求和与原列表和的差值即为缺失值。

    1. # 高斯求和
    2. # 数列求和与原列表和的差值即为缺失值。
    3. class Solution:
    4. def missingNumber(self, nums: List[int]) -> int:
    5. n = len(nums)
    6. return (n * (n + 1) // 2) - (sum(nums))

    总结

    请跟我一起复习高中等差数列求和知识:“首项加尾项乘以项数乘以二”。

  • 相关阅读:
    04 【布局之Overscroll Behavior 定位偏移量】
    web网页设计期末课程大作业 基于HTML+CSS+JavaScript制作八大菜系介绍舌尖上的美食5页
    使用canal和rocketmq同步mysql数据到elasticsearch中【canal,rocketmq,elasticsearch】
    ARM-day2
    webpack常用loader和pluglin
    C++之类与对象(上)
    暂停数据迁移任务
    Ubuntu 22更新kernel导致nvidia-smi报错解决方案
    .NET 与Java 常见技术名词与抽象概念对照
    栈、队列应用
  • 原文地址:https://blog.csdn.net/m0_61661179/article/details/128202751