[Java·算法·困难]LeetCode41. 缺失的第一个正数

文章讲述了如何在未排序的整数数组中找到第一个缺失的正整数,提供了两种解决方案:一种是使用哈希表记录数组元素,另一种是利用布尔数组标记正整数的出现状态。这两种算法都能有效地找出缺失的最小正整数。
摘要由CSDN通过智能技术生成

题目

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

示例

输入:nums = [1,2,0]
输出:3
输入:nums = [3,4,-1,1]
输出:2
输入:nums = [7,8,9,11,12]
输出:1

分析思路1

使用哈希表记录数组中每个数出现的次数。
从 1 开始遍历正整数,判断当前数是否在哈希表中出现过,如果没有出现过则说明该数是第一个缺失的正整数,返回该数。
如果数组中的所有正整数都出现了,则第一个缺失的正整数为数组中所有正整数的最大值加 1。

题解1

class Solution {
    public int firstMissingPositive(int[] nums) {
        Map<Integer,Integer> map = new HashMap();
        for (int i = 0; i < nums.length; i++) {
            if(nums[i]>0){
                map.put(nums[i],i);
            }
        }
        for (int i = 1; i <= nums.length; i++) {
            if(!map.containsKey(i)){
                return i;
            }
        }
        return nums.length+1;
    }
}

执行结果
在这里插入图片描述

分析思路2

另一种解决该问题的算法是基于布尔数组的方式。我们可以创建一个布尔数组 temp,其长度为 n,并初始化所有元素为 false。然后,我们遍历数组 nums,若某个元素 nums[i] 满足 1 <= nums[i] <= n,则将 temp[nums[i] - 1] 设为 true。最后,从 1 开始枚举每一个正整数,若某个正整数对应的 temp元素为 false,则该正整数就是缺失的最小正整数。

题解2

    public static int find(int[] nums){
        int n = nums.length;
        boolean[] temp = new boolean[n];
        for (int num: nums ) {
            if(num>0 && num <= n){
                temp[num-1] = true;
            }
        }

        for (int i = 0; i < temp.length; i++) {
            if(!temp[i]){
                return i+1;
            }
        }
        return n+1;
    }

执行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值