题目使这样的:请设计一个高效算法,查找数组中未出现的最小正整数。
给定一个整数数组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;那么说明出现了下一个连续的正整数,所以match++;
如果A[0] != mach+1,那么有几种情况。
第一种情况是,A[0]<=match,那么这个值是我们不需要的,因为match之前的正整数已经出现了。所以这时候剩下的数最多能使match的值达到maxMatch-1,因为这个无效的元素,需要占用一个位置。同理如果A[0]>maxMatch,这个值也是不需要的,maxMatch-1;还有

本文介绍了如何在O(n)时间和O(1)空间复杂度下找到数组中缺失的最小正整数。通过正向和逆向结合的思想,利用额外的match和maxMatch变量,实现算法过程,最终找到临界点并得出结果。
最低0.47元/天 解锁文章
6146





