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就是答案。

相关推荐
Cccp.12318 分钟前
【leetcode】(二)认识O(NlogN)的排序
算法·leetcode
明月_清风39 分钟前
算法时间复杂度:给小白的一堂"算快慢"课
后端·算法
vivo互联网技术43 分钟前
TinySR:面向真实世界图像超分辨率的轻量级扩散模型
人工智能·算法
铅笔小新z1 小时前
【数据结构】顺序表和链表
数据结构·链表
不会就选b1 小时前
数据结构之栈的算法题(OJ)
linux·数据结构·算法
人工智能培训1 小时前
人工智能性别与地域偏见的成因及消解路径
大数据·人工智能·算法·生活
鹿角片ljp2 小时前
LeetCode 56:合并区间复盘|从排序思维到 List<int[]> 的简洁写法
算法·leetcode·list
M78佐菲2 小时前
Linux学习笔记:网络通信
linux·笔记·学习·算法
漂流瓶jz2 小时前
UVA-1609 不公平竞赛 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·链表·贪心·aoapc·算法竞赛入门经典·uva