寻找第一个缺失的整数

给定一个数组A[0....N-1],找到从1开始,第一个不在数组中的正整数,比如 3,5,7,1 ,6,-3,2 结果是4.

思路:

1)暴力求解:

对于整数1到N,依次与数组中的数进行比对,找出第一个不在数组中的正整数,时间复杂度为O(N^2),空间复杂度为O(1)

2)  哈希求解:
建立一个长度为N的数组,若原数组中的数存在,则在其对应的位置置1,比如原数组中第一个数是3,则A[2]=1,完毕以后遍历即可得知,

易知时间复杂度为O(N),空间复杂度为O(N),此法为空间换时间

3)循环不变式

将找到的元素放到正确的位置,如果发现某个元素一直没找到,则该元素即为所求

循环不变式:如果某命题初始为真,且每次改变后仍保持该命题为真,则若干次改变后该命题为真

具体算法:假设前i-1个数已经找到,分别存放在A[0...i-1]中,继续考察A[i];

若A[i]<i,且A[i]>1,则A[i]在前面已经出现过,丢弃(为了防止算法退化,可将数组最后一个数放在A[i]上继续考察)

若A[i]>i,且A[I]<=N,则将A[i]和A[A[i]]交换;

若A[i]=i,  则考察A[i+1]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值