【Leecode】Leecode刷题之路第41天之缺失的第一个正数

Scroll Down

题目出处

41-缺失的第一个正数-题目出处

题目描述

41-缺失的第一个正数-题目描述

个人解法

思路:

1.构建新数组
2.一个萝卜一个坑思想

代码示例:(Java)

todo

复杂度分析

todo

官方解法

41-缺失的第一个正数-官方解法

41-缺失的第一个正数-官方解法-前言

方法1:哈希表

思路:

41-缺失的第一个正数-哈希表-思路1
41-缺失的第一个正数-哈希表-思路2

代码示例:(Java)

public class Solution1 {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for (int i = 0; i < n; ++i) {
            if (nums[i] <= 0) {
                nums[i] = n + 1;
            }
        }
        for (int i = 0; i < n; ++i) {
            int num = Math.abs(nums[i]);
            if (num <= n) {
                nums[num - 1] = -Math.abs(nums[num - 1]);
            }
        }
        for (int i = 0; i < n; ++i) {
            if (nums[i] > 0) {
                return i + 1;
            }
        }
        return n + 1;
    }


}

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组的长度。
  • 空间复杂度:O(1)。

方法2:置换

思路:

41-缺失的第一个正数-置换-思路

代码示例:(Java)

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

    
}

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组的长度。
  • 空间复杂度:O(1)。

考察知识点

1.正数

2.排序

收获

Gitee源码位置

41-缺失的第一个正数-源码

同名文章,已同步发表于CSDN,个人网站,公众号