leetcode 41.First Missing Positive

水题


题意:

给你一个整数数组,要你在O(n)时间O(1)空间求出第一个没出现的正整数.


思路:

这样想,我可以断言这个数<=数组size+1.

如果这个数组从小到大排列是1,2,3....,那么答案就是数组size+1.

如果不是这样的等差数列,那么[1,数组size]中至少有一个数是缺失的.

因此如果不限制空间的话,只要开一个数组size+1的bool数组记录即可,范围之外的数字可以不管.


可是要O(1)空间怎么办?利用它提供的数组作为bool数组.

先push_back两个不影响答案的数字(比如-1之类的)补充够长度,然后从左往右扫描.

扫描每个位置的时候,判断当前数字k是否∈[1,size+1],是的话就和下标为k的数字交换,然后继续这种判断.

为了避免下标为k的地方已经存放k,而导致死循环的情况,可以加一个判断,是的话可以扫描下一个位置.

最后从左往右再扫描一遍,找到第一个下标为k的数字却不是k的位置,答案就是它.

由于属于[1,size+1]的数字才有可能交换,并且最多交换一次,因此时间复杂度是O(n).


还有一种更暴力的做法是,把数组里的负数变成0(对答案没影响),这样的话数组里所有数的二进制最高位都为0.

这样空出一个二进制位来,就可以作为bool值,相当于多了一个bool数组.


总结:

答案<=数组size+1,利用原数组处理.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值