leetcode题解41-缺失的第一个正数原来如此简单
发布日期:2025-04-05 05:50:51 浏览次数:8 分类:精选文章

本文共 1297 字,大约阅读时间需要 4 分钟。

要解决这个问题,我们需要找出一个未排序的整数数组中没有出现的最小的正整数。这种方法可以通过高效地使用集合来实现。

方法思路

  • 收集所有正整数:首先遍历输入数组,并将所有正整数存储在一个集合中,这样可以快速检查某个数是否存在。
  • 边界检查:如果集合为空,说明所有的正整数都缺失,因此直接返回1。如果集合的最小值大于1,说明1缺失,所以返回1。
  • 检查缺失数:从1开始递增地检查每个正整数,直到找到第一个不存在的数。
  • 处理连续数的情况:如果所有检查过的数都存在,那么最后一个数的下一个正整数即为答案。
  • 这种方法的时间复杂度为O(n log n),因为我们需要对这些正整数进行排序。

    解决代码

    import java.util.Collections;import java.util.Set;import java.util.TreeSet;public class Solution {    public int firstMissingPositive(int[] nums) {        Set
    positiveNumbers = new TreeSet<>(); for (int num : nums) { if (num > 0) { positiveNumbers.add(num); } } if (positiveNumbers.isEmpty()) { return 1; } int min = Collections.min(positiveNumbers); if (min > 1) { return 1; } int max = Collections.max(positiveNumbers); int candidate = 1; while (candidate < max) { if (!positiveNumbers.contains(candidate)) { return candidate; } candidate++; } return max + 1; }}

    代码解释

  • 创建集合:使用TreeSet来存储所有的正整数。TreeSet能够自动排序和去重,这使得查找最小值和最大值非常方便。
  • 处理空集合情况:如果正整数集合为空,说明所有正整数都缺失,所以返回1。
  • 检查最小值大于1的情况:如果最小的正整数大于1,说明1缺失,直接返回1。
  • 递增检查:从2开始逐个检查正整数,直到找到不存在的数。
  • 处理连续情况:如果所有检查过的数都存在,返回最大值加1,因为这是下一个最小的正整数。
  • 这种方法高效地解决了问题,能够快速找到最小的缺失正整数。

    上一篇:leetcode题解434-字符串中的单词数(双指针经典)
    下一篇:leetcode题解4-寻找两个正序数组的中位数

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月17日 14时23分23秒