leetCode 41.First Missing Positive (第一个丢失的正数) 解题思路和方法
发布日期:2025-04-04 23:35:45 浏览次数:12 分类:精选文章

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

重新优化后的文章内容:

在找出数组中第一个缺失的正整数问题上,虽然没有明显的直观解法,但通过巧妙的处理,确实可以在O(n)时间和常数空间内解决。以下是一种高效的方法:

步骤一:整理数组

我们首先遍历数组,并将每个正数调整到它所在的位置。具体来说,对于每个索引i,数组中当前的值应该是i+1。如果当前值不对,我们需要交换它到正确的位置。这样可以确保数组在第一遍处理后趋于有序。

步骤二:检查结果

在第一遍处理之后,数组中的每个索引i应该存储的值是i+1。第二遍遍历数组,寻找第一个位置i,其中数组[i]不等于i+1。这个位置i+1就是我们要找的答案。

这种方法充分利用了原数组的空间,确保了只需常数额外空间,达到O(n)的时间复杂度。

实际代码示例

public class Solution {    public int firstMissingPositive(int[] nums) {        if (nums.length == 0) {            return 1;        }        for (int i = 0; i < nums.length; i++) {            if (nums[i] > 0 && nums[i] != i + 1) {                int j = nums[i] - 1;                while (j >= 0 && j < nums.length) {                    if (nums[j] == i + 1) {                        break;                    }                    if (j == i) {                        break; // Prevents infinite loop                    }                    int temp = nums[j];                    nums[j] = nums[i];                    nums[i] = temp;                }            }        }        for (int i = 0; i < nums.length; i++) {            if (nums[i] != i + 1) {                return i + 1;            }        }        return nums.length + 1;    }}

解释

  • 初始化检查:如果数组为空,直接返回1。
  • 排列数组:遍历每个元素,如果当前元素不在正确的位置,进入循环交换,确保它移动到正确的位置。这种交换避免了死循环,并保持了局部有序。
  • 寻找缺失元素:第二遍遍历数组,检查每个位置是否正确,第一个不正确的位置i的值i+1即为答案。
  • 这种方法不仅高效,还直观地展示了如何利用数组自身来解决问题,达到了最佳的时间复杂度。

    上一篇:leetcode 447. 回旋镖的数量(Number of Boomerangs)
    下一篇:Leetcode 404. 左叶子之和

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年05月07日 02时21分27秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章