LeetCode 41. 缺失的第一个正数
题目描述
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
提示:
- 1 <= nums.length <= 5 * 105
- -231 <= nums[i] <= 231 - 1
解题思路
原地调整,让各元素各归其位,位上没有正确元素的即为缺失元素。
参考代码
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
// mapping <index, value> : <i, i+1>
size_t n = nums.size();
for (int64_t i = 0; i < n; i++)
{
while (nums[i] != i+1) {
int64_t j = int64_t(nums[i]) - 1; // attention overflow
if (j < 0 || j >= n) break;
if (nums[i] == nums[j]) break;
std::swap(nums[i], nums[j]);
}
}
for (int64_t i = 0; i < n; i++)
{
if (nums[i] != i+1) {
return i+1;
}
}
return n + 1;
}
// attention overflow case
// [2147483647,2147483646,2147483645,3,2,1,-1,0,-2147483648]
};