题目
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.
分析
寻找第一个非负的缺失的数
思路是数组内交换。例如3,4,-1,1
现将3和num[3-1]上的数交换,所有的交换完成后,遍历数组, 看哪个位置上的数不是i+1
考虑以下情况
- 数组上的数为负或者超出数组长度,此时不交换
- 如果要交换的位置和当前位置相等,则不交换
- 否则交换后i不变,继续
<font face="Consolas ">
public static int firstMissingPositive(int[] nums) {
for (int i = 0; i < nums.length;) {
if (nums[i]==i+1) {
i++;
continue;
}
int xx = nums[i];
if (xx >=1&& xx<=nums.length) {
nums[i] = nums[xx-1];
if (xx == nums[xx-1]) {
i++;
continue;
}
nums[xx-1] =xx;
} else {
i++;
}
}
for (int i = 0; i<nums.length; i++) {
if (nums[i] != i+1) {
return i+1;
}
}
return nums.length+1;
}
</font>