41. 缺失的第一个正数

41. 缺失的第一个正数(难度困难)

题目链接:https://leetcode-cn.com/problems/first-missing-positive/

题目链接:

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

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

提示:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。

解法一:利用数组的下标

我们分析题目不难发现,没有出现的最小正整数一定是小于等于数组长度+1的。

我们只需要创建一个整数数组a,长度为nums数组长度+1,然后我们遍历一遍数组nums,将 nums[i] > 0 并且 小于 nums数组长度+1的元素,作为 a数组的下标,并且标记a[nums[i]] = 1,当遍历完成之后,我们只需要再遍历一遍数组a,找到第一个等于0的元素,他的下标就是问题的结果,即没有出现的最小正整数。

41. 缺失的第一个正数_第1张图片

代码:

class Solution {
    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;
    }
}

你可能感兴趣的:(LeetCode热门100道)