链接:找到所有数组中消失的数字
描述:给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
要求:您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
输入:[4,3,2,7,8,2,3,1]
输出:[5,6]
思路:当然一开始能想到的就是hash表,但是我觉得时间复杂度和空间复杂度容易超标。所以可以换个思考方式。
既然是不使用额外空间,那就原地做一点改变好了。
所以我的做法就是,对一出现过的数据,在以该数据作为下标的数据做一点记号,在我这里就是改变符号。在后来的一次遍历中,找到没有这个记号的数据的下标。
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int len = nums.size();
for(int i = 0; i < len ; i++) //按顺序遍历nums数组
{
if(nums[abs(nums[i]) - 1] > 0) //判断该下标的数据是否出现过
{
nums[abs(nums[i]) - 1] = -nums[abs(nums[i]) - 1]; //改变存在数对应下标上的数的符号
}
}
vector<int> a;
for(int i = 0 ; i < len ; i++)
{
if(nums[i] > 0) //大于零表示该数没有出现过
{
a.push_back(i + 1); //+1是因为下标从0开始,题目意思从0开始
}
}
return a;
}
};
即使打败了98%的用户,但是内存使用还是有31.1MB,这就是C++吧
私认为LeetCode的好处不止是可以刷题,还可以学习很多大佬的做法,我每次都会学习一下别人的做法,这次在官方题解下见到了一个新东西:auto关键字,遂在此做些笔记:
for(auto &a :b) 循环的另一种用法
int arr[10];
for(int i=0;i<10;i++)
{
arr[i]=i;
}
for(auto &a:arr)
{
std::cout << a;
}
输出的结果就是0—9这十个数。
for(auto &a : arr)中“auto &a”就是变量名就和上一个for循环中的“int i”一样,与for(int i=0;i<sizeof(arr);i++)是一样的。