41. 缺失的第一个正数 - 力扣(LeetCode)
要找的是第一个正数。使用换座位的思路,把每个正数放在它应该在的位置上去(1放在第一位,2放在第二位。。。)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for(int i = 0; i < n; ++i){
while(nums[i] > 0 && nums[i] <= n && nums[i] != nums[nums[i]-1])
swap(nums[i], nums[nums[i] -1]);
}
for(int i = 0; i < n; ++i){
//cout << nums[i] << endl;
if(nums[i] != i+1) return i+1;
}
return n+1;
}
};
另一种哈希表的思路:缺失的第一个正数 - 缺失的第一个正数 - 力扣(LeetCode)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for (int& num: nums) {
if (num <= 0) {
num = n + 1;
}
cout << num << " ";
}
for (int i = 0; i < n; ++i) {
int num = abs(nums[i]);
if (num <= n) {
nums[num - 1] = -abs(nums[num - 1]);
}
}
for (int i = 0; i < n; ++i) {
if (nums[i] > 0) {
return i + 1;
}
}
return n + 1;
}
};