题目
Given 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.
思路1
我的第一反应是利用java的HashSet类:
- 将数组中的元素存放到HashSet中,此过程去除了重复元素
- 从1到A.length进行遍历,遍历期间哪个int值不存在于HashSet中,则这个int值为第一个丢失的正数
AC代码
public class Solution {
public int firstMissingPositive(int[] A) {
int miss = A.length + 1;
HashSet<Integer> hashset = new HashSet<Integer>();
for (int i = 0; i < A.length; i ++) {
hashset.add(A[i]);
}
for (int i = 1; i <= A.length; i ++) {
if (! hashset.contains(i)) {
miss = i;
break;
}
}
return miss;
}
}
思路2
因为题目中要求的是常量的空间复杂度,思路1的空间复杂度明显为O(n)了,不符合题意,因此需要在数组自身上就地进行swap操作
首先,明确一个前提,丢失的第一个正数一定是区间[1 ~ A.length + 1]之间的数据
其次,0是-1与1之间的整数。0不正也不负
因此,我们可以用数组A[i]存放(i + 1),从头开始遍历数组,哪个数值没有放在正确的位置(忽略不符合要求的数),将这个数交换到正确的位置,时间复杂度为O(n),空间复杂度为O(1)。
最后,再从i = 0 开始遍历数组,第一个A[i] != i + 1的数即为缺失的数据
AC代码
public class Solution {
public int firstMissingPositive(int[] A) {
int tmp, miss = A.length + 1;
for (int i = 0; i < A.length;) {
if (A[i] != i + 1 && A[i] >= 1 && A[i] <= A.length && A[i] != A[A[i] - 1]) {
tmp = A[A[i] - 1];
A[A[i] - 1] = A[i];
A[i] = tmp;
} else {
i ++;
}
}
for (int i = 0; i < A.length; i++) {
if (A[i] != i + 1) {
miss = i + 1;
break;
}
}
return miss;
}
}