第一周 LeetCode41 First Missing Positive

本文详细解析了LeetCode上的第41题FirstMissingPositive,介绍了如何在O(n)时间内寻找最小缺失正整数,并在常数额外空间限制下实现算法。通过实例展示了算法流程,包括特殊情况处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

First Missing Positive

LeetCode上的41题:https://leetcode-cn.com/problems/first-missing-positive/description/

题目

Given an unsorted integer array, find the smallest missing positive integer.

Example 1:

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

Example 2:

Input: [3,4,-1,1]
Output: 2

Example 3:

Input: [7,8,9,11,12]
Output: 1

Your algorithm should run in O(n) time and uses constant extra space.

题解

设数组长度为n,容易看出要找的最小的缺失正整数必然在1到n+1之间,如果数组的所有数在1到n之间,那么缺失的第一个正数为n+1,否则缺失的第一个正数在1到n之间。
如果不考虑空间的话可以使用一个大小为n的数组,然后遍历原数组,若元素值在1到n之间,则在数组对应该元素值的地方(元素值减一)做记录。最后遍历新的数组,找到第一个没有做记号的位置,返回下标加一。若没有找到说明原数组的元素值都在1到n之间,那么答案为n+1

但是题目要求使用常数空间,故不能使用新的数组,而是要在原数组上进行修改。方法和上面基本一样,当扫描到元素值在1到n之间的数,若其位置不对则将其放在对应位置上。在第二个例子,遍历到3时将3和位置2的数交换,得到[-1, 4, 3, 1],当元素值不在1到n之间,或是该元素位置正确则继续遍历。

此时需要处理一种特殊情况,如数组[2, 2],当遍历第一个2时将其与位置1的数交换,但交换的也是2,导致死循环,因此交换时需要测试交换的两个数是否相等。这个条件如果成立,说明该元素对应的位置已经放置了正确的数,不用交换继续遍历。

代码

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int k = 0, _size = nums.size();
        while (k < _size) {
            if (nums[k] > 0 && nums[k] < _size + 1 && nums[k] != nums[nums[k] - 1]) {
                    swap(nums[k], nums[nums[k] - 1]);
            }
            else {
                k++;
            }
        }

        int j = 0;
        for (; j < _size; j++) {
            if (nums[j] != j + 1)
                return j + 1;
        }
        return j + 1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值