【LeetCode-442】Find All Duplicates in an Array(C++)(

来源:互联网 发布:openstack的网络配置 编辑:程序博客网 时间:2024/06/04 19:34

题目要求:给出一个整型数组nums,长度为n,则数组中的元素在1~n之间,有些元素出现了两次,有些元素出现了1次,找出那些出现了两次的数。

问题解答:

1. 时间复杂度为O(n),空间复杂度为O(n)的解法。利用一个长度为n的数组temp,初始化为0,遍历数组nums[i],判断temp[nums[i]-1]是否为0,如果是,则说明nums[i]第一次出现,将temp[nums[i]-1]置为1。如果temp[nums[i]-1]的值已经为1了,则说明nums[i]已经是第二次出现了,将nums[i]放到result数组里面去。当然也可以用set或者map来实现,不过set和map还存在查找元素的过程,花费的时间要长一点。

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

2.时间复杂度为O(n),空间复杂度为O(1)的解法。具体思路与448题一致,即将相应位置上的数取相反数。

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



0 0
原创粉丝点击