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;
    }
};
41. 缺失的第一个正数
https://blog.hzau.top/posts/algorithm/41-first-missing-positivedescription/
作者
Dawn Journey
发布于
2025-04-23
许可协议
CC BY-NC-SA 4.0