题意:给一个长度为n,1《元素值《n,求数值1~n中没出现过的数,时间复杂度限制为O(n),除了要输出的数组,不能开额外的空间
思路:由于时间和空间的限制,所以只能在原来的数组上进行操作,由于元素值为1~n,正好对应数组的下标,所以对每个出现过的数值,把其对应的下标元素变为负值,最后遍历一遍数组,元素值大于0的下标就是没出现过的数。
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> arr;
for(int i = 0;i<nums.size();i++)
{
nums[abs(nums[i])-1] = -abs(nums[abs(nums[i])-1]);
}
for(int i = 0;i<nums.size();i++)
{
if(nums[i]>0)
{
arr.push_back(i+1);
}
}
return arr;
}
};