自己思路代码:
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n = nums.size();
int hashTable[100010] = {0};
int i = 0;
for(i = 0; i < nums.size(); i++){
hashTable[nums[i]]++;
}
vector<int> ans;
for(i = 1; i<= n; i++){
if(hashTable[i] == 0){
ans.push_back(i);
}
}
return ans;
}
};
运行结果
官方题解思路:
不另外设置哈希表,而是让自己充当哈希表。
例,遍历 nums[0],这里数字为 4,那么就让代表 下标为 4-1 的数字 + n。这样遍历完一圈之后。又因为当对应数字+n之后,它数组下标可能会大于8,所以在访问下标的时候,需要对8取模。
这样就可以看出来哪个数字没有在数组中出现了。
代码:
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n = nums.size();
int i = 0;
for(i = 0; i < n; i++){
int x = (nums[i]-1) % n;
nums[x] += n;
}
// 创建存储 没出现过的数字的数组
vector<int> ans;
for(i = 0; i < n; i++){
if(nums[i] <= n){
ans.push_back(i+1);
}
}
return ans;
}
};
运行结果: