LeetCode 41 – 缺失的第一个正数

题目描述

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。

题目分析

位置置换,哈希表的思想.
数组大小为 n,则缺失的第一个正数在 [1, n + 1] 内
在数组内进行位置置换,保证数字 x 放在 x – 1 的位置上(超出范围则不做处理)。
最后从头遍历一次,第一个不符合规则的位置,即是缺少的正数。
如果 n 个数字全都符合规则,则答案是 n + 1
时间复杂度 O(n), 空间复杂度 O(1)

Java

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

Kotlin

fun firstMissingPositive(nums: IntArray): Int {
    val n = nums.size
    for (i in nums.indices) {
        var x = nums[i]
        while (x in 1..n && nums[x - 1] != x) {
            val temp = nums[x - 1]
            nums[x - 1] = x
            nums[i] = temp
            x = nums[i]
        }
    }
    for (i in nums.indices) {
        if (nums[i] != i + 1) {
            return i + 1
        }
    }
    return n + 1
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部