题目大意:
在一个无序数组里找出第一个没出现的正数。
思路:
关键点在于,这个数字一定是1 - n+1的一个数字。
可以用map标记,但是这样用了额外的空间。
还可以直接对数组操作,把在这个范围的数字都放到自己的对应位置,然后遍历数组,找到第一个不符合的位置。
代码:
代码1:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
map<int, int> mp;
for (int num: nums) {
if (num >= 1 && num <= n) {
mp[num]++;
}
}
int ans;
for (int i=1; i<=n+1; ++i) {
if (!mp[i]) {
ans = i;
break;
}
}
return ans;
}
};
代码2:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for (int i=0; i<n;) {
if (nums[i] >= 1 && nums[i] <= n && nums[i] != i+1 && nums[i] != nums[nums[i]-1]) {
swap(nums[i], nums[nums[i]-1]);
}else {
++i;
}
}
int ans = n+1;
for (int i=0; i<n; ++i) {
if (nums[i] != i+1) {
ans = i+1;
break;
}
}
return ans;
}
};