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; } };