本题其实要考虑的是数组的长度,因为题目限定死了,我一开始还定义了一个maxnum来算最大的值,后面发现这样的思路有问题
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
map<int,int> a;
int maxnum;
for(auto num:nums){
a[num]++;
if(num>maxnum) maxnum = num;
}
vector<int> n;
for(int i=1;i<=maxnum;i++){
if(a.count(i)<=0) n.push_back(i);
}
return n;
}
};
执行的结果不敬人意,原因是使用了哈希表,其实并不用,只需要再原数组的基础上进行修改即可,参考官方的代码我做了如下的修改
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n = nums.size();
for (auto& num : nums) {
int x = (num - 1) % n;
nums[x] += n;
}
vector<int> ret;
for (int i = 0; i < n; i++) {
if (nums[i] <= n) {
ret.push_back(i + 1);
}
}
return ret;
}
};
最后把时间提升到了40ms
原因是官方给的代码的时间复杂度为O(n),而遍历一遍数组+查找哈希表的算法需要的时间复杂度为O(nlogn)所以时间上会有这么大的误差