LeetCode hot100——缺失的第一个正数

题目

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

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

示例 1:

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

示例 2:

复制代码
输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。

示例 3:

复制代码
输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1

题解

复制代码
class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            // nums[i] 在 [1,n],并且 nums[i] 没有在正确位置上,就交换
            while (nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
                int temp = nums[nums[i] - 1];
                nums[nums[i] - 1] = nums[i];
                nums[i] = temp;
            }
        }
        // 查找第一个不满足 nums[i] = i+1
        for (int i = 0; i < n; i++) {
            if (nums[i] != i + 1) {
                return i + 1;
            }
        }
        // 1~n全部存在
        return n + 1;
    }
}

思路

要求:时间 O(n),空间 O(1)

对于长度为 n 的数组,答案一定落在 1,n+1 之间。

  • 如果 1~n全部出现,答案就是 n+1
  • 否则答案就是 1~n 中第一个没出现的数

我们把数值 x 放到下标 x‑1 的位置上。例如数字1放到索引0,数字2放到索引1。最后遍历数组,第一个不满足 nums[i] == i+1 的位置,i+1就是答案。

相关推荐
涉密IT资质笔记1 分钟前
涉密资质投入产出分析模型:时间成本、四块成本构成与 ROI 决策框架
java·开发语言·算法
木井巳4 分钟前
【BFS 解决拓扑排序】火星词典
java·算法·leetcode·广度优先·宽度优先·图搜索算法
北风toto14 分钟前
KMP 算法详解:从暴力匹配到 O(n+m) 的字符串搜索
java·开发语言·算法
沫璃染墨16 分钟前
《从零入门数据结构与算法(二):线性表详解——从顺序表原理到静态与动态实现》
c语言·数据结构·顺序表
林澈在路上21 分钟前
哪个写歌软件可以用自己声音?MELO音乐详解
人工智能·python·算法
爱读书的小胖22 分钟前
Codewars Sum of a Sequence Hard Core Version C 解题分析
c语言·数据结构·算法
不会就选b22 分钟前
算法日常・每日刷题--<动态规划>24
算法·动态规划
晴天的雨.99232 分钟前
【C++】 priority_queue知识点总结
开发语言·数据结构·c++
Shaoshing34 分钟前
二分模板(左右查询)
java·算法·二分
闻缺陷则喜何志丹36 分钟前
概要设计说明书应包括的内容
数据结构