力扣 41. 缺失的第一个正数(2018年408真题)

120 阅读1分钟

解法一

如果全为正数,例如: 3 4 5 13\ 4\ 5\ 1, 此时可以通过打标记的方法,将已经出现的正数所在的位置变成负数,比如:3 4 5 1-3\ 4\ -5\ -1 ,可以看出,第一个正数 44 所在的位置即为答案。

如果存在负数,则可以将其变为任意大于 nn 的数,可以通过规约证明,与全为正数的解法相同

时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size(), ans = n + 1;
        for(auto &it: nums) {
            if(it <= 0 or it > n) it = n + 1;
        }
        for(int i = 0; i < n; i ++) {
            int x = abs(nums[i]);
            if(x == n + 1) continue;
            nums[x - 1] = -abs(nums[x - 1]);
        }
        for(int i = 0; i < n; i ++) {
            if(nums[i] > 0) {
                ans = i + 1;
                break;
            }
        }
        return ans;
    }
};