【LeetCode-448】 Find All Numbers Disappeared in an Array(C++)

来源:互联网 发布:山东鼎信网络充值 编辑:程序博客网 时间:2024/05/29 16:24

题目要求:给出一个整形数组,长度为n,数组中的整数都在1~n之间,有些数出现一次,有些数出现两次,求出那些没出现的数的集合。

问题解答:

1.时间复杂度为O(n),空间复杂度为O(n)的做法。定义一个长度为n的数组temp,全都初始化为0。然后遍历给出的数组,令temp[nums[i]-1]=-1。最后遍历数组temp,那些值为0的数的位置加上1就是所要求的没有出现的数。

class Solution {public:    vector<int> findDisappearedNumbers(vector<int>& nums) {        int l=nums.size();        vector<int> temp(l,0);        vector<int> result;        for(int i=0;i<l;i++){            temp[nums[i]-1]=-1;        }        for(int i=0;i<l;i++){            if(temp[i]==0)               result.push_back(i+1);        }        return result;    }};
2.时间复杂度为O(n),空间复杂度为O(1)的做法。(符合题目要求的做法,没有使用多余空间)。遍历数组,索引为i,将nums[i]-1所在的位置的数置为负数。再次遍历数组,索引为index,对于每个数组值,如果为负数,就代表index+1这个数已经出现过了,如果为正数,代表没出现过,放到要返回的数组里面。

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




0 0
原创粉丝点击