【leetcode热题100】缺失的第一个正数

本文介绍了一种解决LeetCode问题的算法,目标是在给定的未排序整数数组中找到第一个未出现的正整数。通过遍历数组并利用负数标记出现过的值,最后返回第一个大于0的元素加1作为答案。
摘要由CSDN通过智能技术生成

题目描述

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

解法:

如果数组中出现了 n,且 0 < n < nums.size(),那么就在 nums[n] 中记录该值出现过。但是 nums[n] 中的值在后面遍历的时候还需要使用。如何在保存原有信息的同时在 nums[n] 中记录下 n 出现过,这是关键。

如果数组中的数全部为正,那么可以设置 nums[n] = -nums[n],即如果 nums[n] 是负的,说明 n 存在在原数组中。遍历的时候遇到负值,可以通过取反的得到原来的数。但这里输入数组存在负值,可以先遍历数组把负数修改为 INT_MAX

遍历完成后,数组中第一个大于 0 的数的下标,就是要找的数。因为长度为 m 的数组中,最大下标是 m-1,如果数组中存放的是 1~m,那么 m 就无法标记。因此,我们使用下标 0 来标记 1

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        if(nums.empty()){
            return 1;
        }
        const int MAX_INT = numeric_limits<int>::max();
        transform(nums.begin(), nums.end(), nums.begin(), [MAX_INT](int n){
            return (n <= 0) ? MAX_INT : n;
        });

        for(int n: nums){
            if(n < 0){
                n = -n;
            }
            if(n > nums.size()) {
                continue;
            }
            if(nums[n-1] > 0){
                nums[n-1] = -nums[n-1];
            }
        }
        
        for(size_t i=0;i<nums.size();i++){
            if(nums[i] > 0){
                return i + 1;
            }
        }
        return nums.size() + 1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值