水题
题意:
给你一个整数数组,要你在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,利用原数组处理.