LeetCode -- 448.找到所有数组中消失的数字

这篇博客探讨了一种在O(n)时间和不使用额外空间的限制下,解决寻找给定范围内未出现在数组中的数字的方法。作者通过改变数组元素的符号来标记已出现的数字,并在后续遍历中找出未被标记的数字。此外,还介绍了C++中的`auto`关键字在循环中的应用。
摘要由CSDN通过智能技术生成

链接找到所有数组中消失的数字

描述:给定一个范围在 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++)是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值