丢失的数字
概述:给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
输入:nums = [9,6,4,2,3,5,7,0,1]
方法一:暴力循环
思路:简化思路,缺失数字为一个,所以总长度为 len(nums) + 1。然后暴力循环判断是否在原列表里面即可。
def missingNumber(self, nums: List[int]) -> int:
for num in range(len(nums) + 1):
方法二:排序+if大法
思路:此算法的精髓在于排序,对于头尾缺失情况直接返回即可。但是若中间缺失的话,前后依次相减,找到等于 2 的位置的值。
def missingNumber(self, nums: List[int]) -> int:
if nums[-1] == len(nums) and nums[0] == 0:
nums_new = [nums[i+1] - nums[i] for i in range(len(nums) - 1)]
return nums_new.index(2) + 1
if nums[-1] != len(nums):
方法三:排序(优化版)
思路:排序以后,用 enumerate() 方法枚举列表,如果位置不等于值,返回即可。
def missingNumber(self, nums: List[int]) -> int:
for i,v in enumerate(nums):
方法四:哈希集合
思路:set() 集合的特点是有序不重复,依次判断返回即可。
def missingNumber(self, nums: List[int]) -> int:
for i in range(len(nums) + 1):
方法三:高斯求和
思路:数列求和与原列表和的差值即为缺失值。
def missingNumber(self, nums: List[int]) -> int:
return (n * (n + 1) // 2) - (sum(nums))
总结
请跟我一起复习高中等差数列求和知识:“首项加尾项乘以项数乘以二”。