360 字
2 分钟
41. 缺失的第一个正数
41. 缺失的第一个正数
题目:https://leetcode.cn/problems/first-missing-positive/
思路
原先的思路:没有。。。
这里要求 O(1) 的空间复杂度来解决这道图,说明不能自己创建状态数组来记录,这说明了要寻找自身的信息。这道题的额外信息是:利用数组的下标来记录信息。将 i 处的值与 nums[i] 处的值呼唤,说明了:nums[i] 这个值在 nums 是存在的。
代码
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
int idx = 0;
while (idx < n) {
if (nums[idx] > 0 && nums[idx] <= n) {
if (nums[idx] == idx + 1) { // 已经在正确的位置上
idx++;
} else {
if (nums[nums[idx] - 1] != nums[idx]) { // 只有在不相等时才交换
std::swap(nums[idx], nums[nums[idx] - 1]);
} else {
idx++;
}
}
} else {
idx++;
}
}
for (int i = 0; i < n; i++) {
if (nums[i] != i + 1) { return i + 1; } // 找到第一个不等于 i + 1 的位置
}
return n + 1;
}
};
可以对上面的代码进行一些化简(虽然并没有什么用,而且可读性更差了)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
int idx = 0;
while (idx < n) {
if ((nums[idx] > 0 && nums[idx] <= n) && nums[idx] != nums[nums[idx] - 1]) {
std::swap(nums[idx], nums[nums[idx] - 1]);
} else {
idx++;
}
}
for (int i = 0; i < n; i++) {
if (nums[i] != i + 1) { return i + 1; } // 找到第一个不等于 i + 1 的位置
}
return n + 1;
}
};