[leetcode题后感]first missing positive

这个题有点坑 题目就没读懂啥意思 百度了各路大神之后才知道 是求第一个没出现过的正整数

题目很简单 但是限制条件很苛刻 要求O(n)时间和O(1)的空间 所以难度增加

思路大概如下

既然是n个数字的数组,那么也就是求1-n中数字第一个没再数组中出现的就是所求的

既然不让用多余的空间,那么久考虑在原数组上做文章,而数组下标的特性,正好是0-n-1的n个数字

所以很自然想到 讲0 - n-1 和1-n相对应,一开始想扫描整个数组 当出现一个数字的时候 把这个数字所对应的值取出来 然后把值改为特殊的标志变量 比如INT_MAX之类的 但是这样做的话很难保证不会和原数组的输入数字重复,所以又很想到那我直接存这个数字本身不就好了,即把该数字存到该数字所对应的位置。但是这样就要考虑有可能发生的遇到了相同数字怎么办 如果遇到相同数字可能会产生死循环,因为只要在交换数字的时候加一个判断 若目标位置所存的数字已经满足了标志(即a[i]=i+1)那么就不做交换。

所以算法如下

依次扫描每一个元素,若当前位置符合a[i]=i+1,则跳过本次循环,当不符合条件时候讲当前位置的数字放到当前数字-1的位置,若目标位置已经满足a[j]=j+1则不做交换,否则一直交换,直到换过来的数字无法赋值给新的位置位置(即数字超过数组下标范围)

至此leetcode可以ac

但是我对于这个算法不是很确定 虽然满足了O(1)的空间复杂度,但是时间复杂度方面,由于需要两个循环,我也没办法确定是否是O(n)的,但是百度了一下发现大家也都是这么做的而且也存在一定的争论。所以还是期待新的方法产生。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值