给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
前言: 方法一:哈希表
代码1:
//哈希表时间复杂度O(n),空间复杂度O(1) int firstMissingPositive(vector方法二:置换 代码2:& nums) { int n = nums.size(); for (int& num : nums) { if (num <= 0) { num = n + 1; } } 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; }
int firstMissingPositive2(vector& nums) { int n = nums.size(); for (int i = 0; i < n; ++i) { while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) { swap(nums[nums[i] - 1], nums[i]); } } for (int i = 0; i < n; ++i) { if (nums[i] != i + 1) { return i + 1; } } return n + 1; }



