给定一个数组,找出数组缺少的最小的正整数

本文介绍了如何在O(n)时间和O(1)空间复杂度下找到数组中缺失的最小正整数。通过正向和逆向结合的思想,利用额外的match和maxMatch变量,实现算法过程,最终找到临界点并得出结果。
摘要由CSDN通过智能技术生成

题目使这样的:请设计一个高效算法,查找数组中未出现的最小正整数。

给定一个整数数组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;那么说明出

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值