数组中未出现的最小正整数
题目来源《程序员代码面试指南》第八章
题目描述
给定一个无序数组arr,找到数组中未出现的最小正整数
arr = [-1, 2, 3, 4]。返回1
arr = [1, 2, 3, 4]。返回5
[要求]
时间复杂度为 O ( N ) O(N) O(N),空间复杂度为 O ( 1 ) O(1) O(1)
思路
理想情况:一个N长度的有序数组存放[1,2,...,N]
这样的数组,要找出缺少的最小正整数只需要从头开始遍历,发现data[l] != l + 1
的即为所求。
按照理想情况来推,在遍历的过程中将数组恢复到[1,...,N]
的理想情况
设置两个变量l
和r
。l
表示已经搜索到的正数范围[1,l]
,r
表示理想情况下能搜索到的最大范围[1,r]
。假设数组的长度为N
l
初始化为0,因为刚开始没有正数,r
初始化为N,因为一个N长度的数组,理想情况下存放[1,...,N]
这样N个正数。
假设遍历到data[l]
后,分情况讨论:
data[l] == l + 1
,也就是按照理想情况这个数放置的位置是正确的,已知的正数范围变为[1,l]
,l++
data[l] <= l
,这种情况说明出现了数组里已经出现过了该数或者负数和0,那么r表示的范围也需要缩小变为<