First Missing Positive
Total Accepted: 5538 Total Submissions: 25376Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0]
return 3
,
and [3,4,-1,1]
return 2
.
Your algorithm should run in O(n) time and uses constant space.
分析:
很直接的一个思路是:使用数组vis标记A中正数值的出现(vis[A[i]]=ture,A[i]>0),在A中没有出现的最小正数就是答案。但是题目对空间的要求使得根据A的大小动态建立vis变为不可能,因此只能利用已有的空间:数组A。A既是传入数据,也用作标记数组。选定标志flag,当A[i]>0 && A[i] - 1 >= 0 && A[i] - 1 < A.length时,用临时变量x先保存A[A[i]-1],再令A[A[i]-1]=flag,从而实现对A[i]做标记。对于x,执行相同的操作,直至x不满足x>0 && x - 1 >= 0 && x - 1 < A.length
Java Code:
public int firstMissingPositive(int[] A) {
int i;
final int flag = -1; //选定-1为标志
for (i = 0; i < A.length; ++i) { //如果A中有flag,要先清除
if (A[i] == flag) {
A[i] = 0;
}
}
//下面的for-loop负责扫描并标记正数
for (i = 0; i < A.length; ++i) {
int x = A[i], y = x;
while (0 <= y - 1 && y - 1 < A.length && A[y - 1] != flag) {
x = A[y - 1];
A[y - 1] = flag;
y = x;
}
}
//下面的for-loop负责找出未出现的最小正数
for (i = 0; i < A.length; ++i) {
if (A[i] != flag) {
break;
}
}
return i + 1;
}