[LeetCode] Find All Numbers Disappeared in an Array

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.

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[5,6]

找出数组中消失的数,首先一个关键条件是1 ≤ a[i] ≤ n (n = size of array),一些元素出现2次,另一些元素出现1次。找出没有出现的数字。设想这道题中数组元素和数组索引肯定有关,数组元素 1~n, 数组索引 0~n-1, 令idx = abs(nums[i]) - 1, 这一数组元素与数组索引对应关系,如果有重复的数组元素,则对应的数组索引必重复。找出数组中消失的索引,从而找到数组中消失的数。出现过的索引对应的元素都变成为负值,遍历一遍数组找出值为正的元素,令其索引+1即可。

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        vector<int> res;
        for (int i = 0; i != nums.size(); i++) {
            int idx = abs(nums[i]) - 1;
            if (nums[idx] > 0)
                nums[idx] = -nums[idx];
        }
        for (int i = 0; i != nums.size(); i++) 
            if (nums[i] > 0) 
                res.push_back(i + 1);
        return res;
    }
};
// 129 ms
原文地址:https://www.cnblogs.com/immjc/p/7152372.html