要求:时间O(n) 空间O(1)
1.置换
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for(int i = 0;i < n;i++){
while(nums[i] > 0 && nums[i] < n+1 && nums[nums[i] - 1] != nums[i]){
int tmp = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = tmp;
}
}
for(int i = 0;i < n;i++){
if(nums[i] != i+1)
return i+1;
}
return n+1;
}
}
2. 将数组看作哈希表
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for(int i = 0;i < n;i++){
if(nums[i] <= 0)
nums[i] = n+1;
}
for(int i = 0;i < n;i++){
int val = Math.abs(nums[i]);
if(val < n+1)
nums[val-1] = -Math.abs(nums[val-1]);
}
for(int i = 0;i < n;i++){
if(nums[i] > 0)
return i+1;
}
return n+1;
}
}