【LeetCode】448. 找到数组中没有出现的元素

问题描述

Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements of [1, n] inclusive that do not appear in this array.

Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.

给定一个整数数组,其中 1 ≤ a[i] ≤ n (n = 数组大小),有些元素出现两次,有些元素出现一次。
找到 [1, n] 中不出现在这个数组中的所有元素。
你能在 O(n) 运行时不需要额外的空间吗?你可以假定返回的列表不算作额外的空间。

输入:
[4,3,2,7,8,2,3,1]

输出:
[5,6]

Python 实现

从题目条件可以知道,数组中的元素可以与数组索引形成一个对应关系。举个理想的情况,一个长度为n的数组,其索引为 0 到 n-1,其元素为 1 - n。这样子索引与元素值之间的关系就是:索引 + 1 = 元素值。因此,我们可以通过数组中出现的元素值对相应索引对应的值进行标记,最后没有被标记的索引位置,相应的就是没有出现的元素。

具体做法是:

  • 通过一次遍历,将以出现元素的值减 1 为索引的元素乘 -1;
  • 没有出现过的元素,对应 -1 的索引位置的值仍然为正数。
class Solution(object):
    def findDisappearedNumbers(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        
        # Marked the index with element by multiplying -1.
        for idx in range(len(nums)):
            num = nums[idx]
            if nums[abs(num)-1] > 0:
                nums[abs(num)-1] *= -1
            
        # The indeces of remain positive numbers, adding one, are the targets.
        ret_list = []    
        for idx in range(len(nums)):
            if nums[idx] > 0:
                ret_list.append(idx+1)
        
        return ret_list

链接:https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值