原题网址:https://leetcode.com/problems/first-missing-positive/
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.
方法:使用nums[i]==i作为检测链条。
public class Solution {
public int firstMissingPositive(int[] nums) {
int min = Integer.MAX_VALUE;
for(int num: nums) {
if (num > 0 && num < min) min = num;
}
if (min > 1) return 1;
int max = min + nums.length - 1;
for(int i=0; i<nums.length; i++) {
if (min <= nums[i] && nums[i] <= max) nums[i] -= min; else nums[i] = -1;
}
for(int i=0; i<nums.length; i++) {
if (nums[i] == -1 || nums[i] == i) continue;
int next = nums[i];
nums[i] = -1;
while (next != -1 && nums[next] != next) {
int t = nums[next];
nums[next] = next;
next = t;
}
}
for(int i=0; i<nums.length; i++) {
if (nums[i] != i) return min + i;
}
return min + nums.length;
}
}
另一种实现(思路更清晰):
public class Solution {
public int firstMissingPositive(int[] nums) {
int min = Integer.MAX_VALUE;
for(int num : nums) {
if (num > 0) {
min = Math.min(min, num);
}
}
if (min > 1) return 1;
for(int i = 0; i < nums.length; i++) {
nums[i] = (nums[i] > 0) ? nums[i] - min : -1;
}
for(int i = 0; i < nums.length; i++) {
int unresolved = nums[i];
nums[i] = -1;
while (0 <= unresolved && unresolved < nums.length && nums[unresolved] != unresolved) {
int next = nums[unresolved];
nums[unresolved] = unresolved;
unresolved = next;
}
}
for(int i = 0; i < nums.length; i++) {
if (nums[i] == -1) return min + i;
}
return min + nums.length;
}
}