思路:
要求找到第一个应该属于[1,nums.size()]范围内的正数却又目前不在的。
从头开始,挨个把各个数换到相应地位置,然后再扫一遍数组,看哪一个数不在它应在的位置上。
时间复杂度O(N),空间复杂度O(1)。
class Solution {
private:
void change(vector<int> &nums) {
int n = nums.size();
for(int i = 0; i < nums.size(); ++i) {
while(nums[i] != i+1) {
if(nums[i] < 0 || nums[i] > n || nums[i] == nums[nums[i] - 1]) {
break;
}
swap(nums[i], nums[nums[i] - 1]);
}
}
}
public:
int firstMissingPositive(vector<int>& nums) {
change(nums);
for(int i = 0; i < nums.size(); ++i) {
if(nums[i] != i+1) {
return i + 1;
}
}
return nums.size() + 1;
}
};
java code:
public class Solution {
public int firstMissingPositive(int[] nums) {
if(nums == null || nums.length == 0) return 1;
for(int i = 0; i < nums.length; ++i) {
while(nums[i] > 0 && nums[i] <= nums.length && nums[i] != i + 1) {
if(nums[nums[i] - 1] == nums[i]) break;
swap(nums, i, nums[i] - 1);
}
}
for(int i = 0; i < nums.length; ++i) {
if(nums[i] != i + 1) return i + 1;
}
return nums.length + 1;
}
void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}