力扣算法:找到所有数组中消失的数字

力扣算法:找到所有数组中消失的数字

  • 一、找到所有数组中消失的数字
    • 1、问题
    • 2、思路
    • 3、代码
    • 4、时间与空间复杂度
  • 备注

一、找到所有数组中消失的数字

1、问题

力扣算法:找到所有数组中消失的数字_第1张图片

2、思路

题目中提供的信息:

  1. nums是一个含有n 个整数的数组,即:nums的下标为0 ~ (n-1)、nums的长度为n。
  2. 1 <= nums[i] <= n。即:nums数组内的元素均为“nums的长度n”以内的数字。(“随机一个数字,1 ~ n不全有缺失”)
  3. 需要找到1 ~ n的数字中,nums数组中不存在的数字。(例:数字1 ~ 6,nums = [1,2,6,5],数组中不存在的数字为[3,4])

解题思路:

  1. 循环遍历数组,每次nums[元素-1] 肯定会找到一个“元素”,我们将找到这个“元素”加上n。
  2. 找到数组中“元素大小”<= n的元素。(数组中元素不可能大于n,大于则说明我们修改过)
  3. 找到没修改过的“元素”,返回其“下标+1”即为缺失的数字。
    力扣算法:找到所有数组中消失的数字_第2张图片

3、代码

#coding:utf-8
from typing import List

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        n = len(nums)
        for num in nums:
            x = (num - 1) % n
            nums[x] += n
        return [i + 1 for i, num in enumerate(nums) if num <= n]

if __name__ == "__main__":
    # nums = [4, 3, 2, 7, 8, 2, 3, 1]
    # nums =[1, 1]
    nums = [10,2,5,10,9,1,1,4,3,7]

    sl = Solution()
    print(sl.findDisappearedNumbers(nums))

4、时间与空间复杂度

时间复杂度:O(n)
n 为数组 nums 的长度。

空间复杂度:O(1)
返回值不计入空间复杂度。

备注

1、问题转载:
LeetCode
https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array

你可能感兴趣的:(力扣算法,leetcode,python,算法)