LeetCode41☞缺失的第一个正数

关联LeetCode题号41

本题特点
  • 数组,哈希表
本题思路
  1. 找缺失的最小正数,看举例说明缺失的正数,一种情况是连续的最小的正数,一种是缺失连续但不是最小的正数
  2. 验证数组内数组是否连续,可以通过 nums[i]+1 是否存nums组成的哈希表,如果nums[i]+1 <= 0 不符合正数的条件,轻松解决,详情看Java写法
  3. 题目要求时间复杂度O(n)并且只使用常数级别额外空间的解决方案 ,就上难度了,hah Python 数组可以直接提供包含方法,哈哈哈,但是实际上还是通过哈希,不过我是菜鸡 能AC就行
  4. Python写法是好早之前写的了,排序之后,如果当前值和下标一致说明是不缺少的,不一致为缺少,忘记当时从哪学习来的,不过时间复杂度不满足O(n),因为排序了
Python写法
def firstMissingPositive(self, nums: List[int]) -> int:
    # 优先把重复的,小于0的值过滤掉
    nums = list(filter(lambda x: x>0, list(set(nums))))
    if len(nums) == 0:
        return 1
    # 排序
    nums.sort()
    # 值和下标值比较,一致说明不缺少,不一致说明缺少
    for i in range(1, len(nums)+1):
        if i != nums[i-1]:
            return i
    # 补充缺少的值是数组最大值+1的情况
    return nums[len(nums)-1]+1
Java写法
package leetcode;

import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * File Description: FirstMissingPositive_41
 * Author:
 * Date: 2025/4/30 09:39
 */
public class FirstMissingPositive_41 {
    public int firstMissingPositive(int[] nums){
        Map<Integer, Integer> hashmap = new HashMap<>();
        int res = Integer.MAX_VALUE;
        for (int each: nums){
            hashmap.put(each, hashmap.getOrDefault(each, 0)+1);
        }
        if (hashmap.containsKey(1)){
            for (int i = 0; i < nums.length; i++){
                
                if (hashmap.containsKey(nums[i] + 1)) continue;
                else {
                    // 不包含nums[i]+1 说明该值符合缺少条件
                    // 判断是不是正数
                    if (nums[i]+1 <= 0) continue;
                    else {
                        // 判断是不是最小
                        res = Math.min(res, nums[i]+1);
                    }
                }
            }
            return res;
        
        }else{
            // 不包含1,肯定缺少的最小正整数就是1
            return 1;
        }

    }

    @Test
    public void TestFirstMissingPositive(){
        int[] nums = {7,8,9,11,12};
        int res = firstMissingPositive(nums);
        System.out.println(res);
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值