问题描述
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/