玩命加载中 . . .

41-缺失的第一个正数


LeetCode 41. First Missing Positive

LeetCode-41

Given an unsorted integer array nums, return the smallest missing positive integer.

You must implement an algorithm that runs in $O(n)$ time and uses constant extra space.

Example 1:

Input: nums = [1,2,0]
Output: 3

Example 2:
Input: nums = [3,4,-1,1]
Output: 2

method

如果正数都有出现,那应该是[1,2,3,...,n],index与nums[i]相互对应nums[i] == i + 1,不对应就是缺失的最小正数,所以首先要先排序,但是只能用$O(n)$算法,所以只能用置换的方法

nums[i]从位置i换到nums[i] - 1的位置,首先要保证在[1, n]的范围内,如果nums[i]不等于nums[nums[i] - 1]就交换

当前位置i的元素换去nums[i]-1之后,会换回来一个数,这个数如果满足条件的话还要继续换出去,所以要用while

int firstMissingPositive(vector<int>& nums) {
    int n = nums.size();
    for (int i = 0; i < n; i++) {
        while (nums[i] > 0 && nums[i] <= n && nums[i] != nums[nums[i] - 1]) {
            swap(nums[i], nums[nums[i] - 1]);
        }
    }
    for (int i = 0; i < n; i++) {
        if (nums[i] != i + 1) 
            return i + 1;
    }
    return n + 1;
}

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录