- 缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
[1,1]
[0,1,2]
[3,4,-1,1]
[1,2,0]
[1]
[]
[3,4,-1,1]
[7,8,9,11,12]
思路:
- 要找的数一定在[1, n+1]里的整数,即把1放在0索引的位置上,把num[i]放在num[i]-1索引的位置上;
- 遍历数组,找到第一个nums[i] != i + 1的位置;若没有返回nums.size()+1。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for (int i=0; i<n; i++) {
if (nums[i] <= n && nums[i] > 0 && nums[i] != nums[nums[i]-1] && nums[i] != i + 1){
swap(nums[i], nums[nums[i]-1]);
i--;
}
}
for (int i=0; i<n; i++) {
if (nums[i] != i + 1){
return i + 1;
}
}
return n + 1;
}
};
/*4ms,12.2MB*/
时间复杂度:O(N)
空间复杂度:O(1)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for (int i=0; i<n; i++) {
while (nums[i] != i + 1) {
if (nums[i] > n || nums[i] <= 0 || nums[i] == nums[nums[i]-1]){
break;
}
swap(nums[i], nums[nums[i]-1]);
}
}
for (int i=0; i<n; i++) {
if (nums[i] != i + 1){
return i + 1;
}
}
return n + 1;
}
};
/*4ms,12.2MB*/