LeetCode448.Find All Numbers Disappeared in an Array题解

来源:互联网 发布:灯光 控台 软件 编辑:程序博客网 时间:2024/05/04 18:06

1. 题目描述

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.

2. 样例

Input:[4,3,2,7,8,2,3,1]Output:[5,6]

3. 分析

题目描述很清楚,给出一个长度为n的数组,数组内的元素值范围是1-n。有些测试样例中的数组元素没有包括1-n的全部元素,我们的工作是按照升序找到并输出这些没有被包括的元素。
很遗憾,我使用的方法比较愚蠢,只达到了一个要求即时间复杂度为O(n),但是申请了额外的空间vector temp。后来在讨论区看到了大神的方法,真的是啧啧啧。
我的愚蠢解题思路:标准的数组是一个长度为n的数组,并且这个数组里面的元素应该是从1-n升序排列,没有重复,即temp[0]=1, temp[1]=2……temp[n-1]=n。因此我们可以得到这样数组内元素值与元素下标差值为1这个很好的性质,我们的方法是通过比较目标数组与标准数组,将目标数组出现过的元素在标准数组里面标记出来,从而我们输出标准数组里面没有被标记的元素,就是目标数组中的“丢失元素”。
接着我们对给定的目标数组vector nums进行遍历,如果我们发现当前目标数组元素nums[i]与标准数组元素temp[nums[i]-1]相同,就说明,这个元素(例如为3)在目标数组里面出现了,那么标准数组里面对应的这个元素就应该被标记。我们的做法是在标准数组里面找到该元素所在位置,并将元素值置为-1作为标记。
对目标数组遍历之后,在目标数组中出现过的元素,在标准数组内已经被标记为-1了,我们只需要输出标准数组内值不为-1的元素即可。

4. 源码

class Solution {public:    vector<int> findDisappearedNumbers(vector<int>& nums) {        vector<int> result;        vector<int> temp;        int i;        for (i = 1; i <= (int)nums.size(); i++) {            temp.push_back(i);        }        for (i = 0; i < (int)nums.size(); i++) {            if (nums[i] == temp[nums[i]-1]) {                temp[nums[i]-1] = -1;            }        }        for (i = 0; i < (int)temp.size(); i++) {            if (temp[i] != -1) {                result.push_back(temp[i]);            }        }        return result;    }};

5. 心得

看了讨论区大家的方法,都和我差不多,只不过有些写法比我更优化,没有那么多变量,思路都是一样的。很惭愧,只做了一点微小的工作。

0 0
原创粉丝点击