给定一个数组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]