题目要求:给出一个整形数组,长度为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;
}
};