思路:由于本题要求的时间和空间复杂度,不能利用常规方法去做。本题用到的一个思路是将原数组先处理为一个简单的哈希表:即数组的第i个位置存放整数i-1,这一步的时间复杂度平均为O(n),原因引用某网友写的题解解释
说明:while 循环不会每一次都把数组里面的所有元素都看一遍。如果有一些元素在这一次的循环中被交换到了它们应该在的位置,那么在后续的遍历中,由于它们已经在正确的位置上了,代码再执行到它们的时候,就会被跳过。
最极端的一种情况是,在第 1 个位置经过这个 while 就把所有的元素都看了一遍,这个所有的元素都被放置在它们应该在的位置,那么 for 循环后面的部分的 while 的循环体都不会被执行。
平均下来,每个数只需要看一次就可以了,while 循环体被执行很多次的情况不会每次都发生。这样的复杂度分析的方法叫做均摊复杂度分析。
最后再从开始向后遍历一遍,只要出现的时候,i+1即为第一个缺失的正数。