Leetcode 448. Find All Numbers Disappeared in an Array

来源:互联网 发布:blct升级数据 编辑:程序博客网 时间:2024/06/05 18:04

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

 

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

Could you do itwithout extra space and in O(n) runtime? You may assume the returned list doesnot count as extra space.

 

Example:

Input:

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

 

Output:

[5,6]

 

题目的意思是长度为n的数组存了1~n范围的整数,有一些数缺失了,有一些数出现了两次,让找到所有缺失的数。

 

方法1:设置一个标记数组flag,flag下标对应数组中的数,遍历数组中的数,把对应的下标元素标记为1;再遍历flag,元素值为0的就是缺失的数。

优点是思路简单,时间复杂度低O(n),缺点是需要额外空间。

但是题目要求不能开辟额外空间,所以不满足题目要求。

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

方法2:由于题目中有数组中所有数字都大于等于1且小于等于n,而n为数组长度这一条件。所以思路1中不要额外开辟一个标记数组,就用原来的数组自己来标记就行了。将以nums数组元素为下标的数标记为负数,最后遍历,元素值为正数对应的下标值就是缺失元素。时间复杂度O(n),不需要开辟额外空间。

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




阅读全文
0 0
原创粉丝点击