Leetcode--41. 缺失的第一个正数
发布日期:2021-04-30 21:04:42 浏览次数:74 分类:精选文章

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

为了解决这个问题,我们需要找到一个未排序的整数数组中没有出现的最小的正整数。我们的算法需要在O(n)的时间复杂度内完成,并且只能使用常数级别的空间。

方法思路

我们可以通过以下步骤来解决这个问题:

  • 遍历数组处理每个元素:对于每个元素,如果它是正数且在数组的范围内,我们尝试将它放到它应该出现的位置。具体来说,如果元素x应该出现在位置x-1,但当前位置不是x-1,我们交换这两个位置的值。

  • 检查位置是否正确:在处理完所有元素后,遍历数组检查每个位置i是否有i+1的值。如果发现某个位置i没有i+1的值,那么i+1就是最小的缺失正整数。如果所有位置都有正确的值,那么最小的缺失正整数就是数组长度加1。

  • 这种方法确保了每个数都被放到正确的位置,或者标记为缺失,从而在O(n)时间内找到最小的缺失正整数。

    解决代码

    class Solution {    public int firstMissingPositive(int[] nums) {        int n = nums.length;        for (int i = 0; i < n; i++) {            int x = nums[i];            if (x > 0 && x <= n) {                if (x - 1 != i) {                    int temp = nums[x - 1];                    nums[x - 1] = x;                    nums[i] = temp;                }            }        }        for (int i = 0; i < n; i++) {            if (nums[i] != i + 1) {                return i + 1;            }        }        return n + 1;    }}

    代码解释

  • 初始化变量:获取数组的长度n
  • 处理每个元素:遍历数组,对于每个元素x,如果x是正数且在数组范围内,检查它是否应该出现在当前位置。如果不在,交换它和它应该出现的位置的值。
  • 检查位置:再次遍历数组,检查每个位置i是否有i+1的值。如果发现缺失,返回这个值。
  • 返回结果:如果所有位置都有正确的值,返回数组长度加1。
  • 这种方法确保了在O(n)时间和常数级别空间内解决问题,适用于各种输入情况。

    上一篇:【Java2】包/类,运算符,if/switch,for/while
    下一篇:JavaWeb学习笔记(16)__BOM

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2026年06月14日 12时31分54秒