[LeetCode 41.] 缺失的第一个正数

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]
};
posted @ 2021-08-06 23:47  与MPI做斗争  阅读(35)  评论(0编辑  收藏  举报