题目使这样的:请设计一个高效算法,查找数组中未出现的最小正整数。
给定一个整数数组A,请返回数组中未出现的最小正整数。
测试样例:
[-1,2,3,4]
返回1
一看到这个题目我想到的是用另外的一个数组B,长度为A的长度+1,来存储遍历数组A的数的值。 if(A[i] == i+1) B[i+1] = A[i]。然后遍历数组B,出现空缺的地方即是最小未出现的正整数。但是假如要求额外空间复杂度为O(1),那就没办法了。有的人会想到排序,但是排序最好需要O(nlog2n)的时间复杂度。如果要求时间复杂度为O(n),并且空间复杂度为O(1),那么要怎么做呢?这方法是我在牛客网上看到的。听完之后,感觉特别不可思议,实在是太厉害了。在我的理解里,这是一种正向和逆向结合的思想。从前往后和从后往前不停地进行,理想情况和实际情况实时地更新,最后的临界点必然是两者相等。
在这个算法里,有两个额外变量。一个是match,初始值为0。用来标记从正整数1开始已经连续出现的正整数个数。比如说[3, 5, 2, 1, 6] 出现的连续正整数序列为{1 2 3 },所以match= 3;还有一个变量是maxMatch,初始值是整个数组的长度,因为数组在没遍历之前,无法得知其中的元素,所以看作是最理想的情况:里面的数刚好是1到n。
说了两个变量之后,便是算法的部分了。
首先从第0位置开始,如果A[0]=match+1;那么说明出