第一个缺失的整数
给定一个数组A[0…N-1],找到从1开始,第一个不在数组中的正整数。
如3,5,1,2,-3,7,14,8输出4
循环不变式
思路:将找到的元素放到正确的位置上,如果最终发现某个元素一直没有找到,则该元素即为所求。
循环不变式:如果某命题初始为真,且每次更改后仍然保持该命题为真,则若干次更改后该命题仍然为真。
为表述方便,下面的算法描述从1开始数
利用循环不变式设计算法
假定前i-1个数已经找到,并且依次存放在A[1,2,…,i-1]中,继续考察A[i]:
若A[i]<i且A[i]≥1,则A[i]在A[1,2,…,i-1]中已经出现过,可以直接丢弃。
若A[i]为负,则更应该丢弃它。
若A[i]>i且A[i]≤N,则A[i]应该位于后面的位置上,则将A[A[i]]和A[i]交换。
若A[i]≥N,由于缺失数据一定小于N,则A[i]丢弃。
若A[i]=i,则A[i]位于正确的位置上,则i加1,循环不变式扩大,继续比较后面的元素
合并相同的分支
整理算法描述:
若A[i]<i或者A[i]>N,则丢弃A[i]
若A[i]>i,则将A[A[i]]和A[i]交换。
若A[i]=i,i加1,继续比较后面的元素。
思