LeetCode-热题100:41. 缺失的第一个正数

题目描述

给你一个未排序的整数数组 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 <= numsi <= 231 - 1

代码及注释

go 复制代码
func firstMissingPositive(nums []int) int {
    length := len(nums)
    // 第一次遍历数组,将每个正整数放到其应该在的位置
    for i := 0; i < length; i++ {
        for nums[i] > 0 && nums[i] <= length && nums[i] != nums[nums[i]-1] {
            // 交换 nums[i] 和 nums[nums[i] - 1] 的值
            nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
        }
    }
    // 第二次遍历数组,找到第一个不在其正确位置上的数字
    for i := 0; i < length; i++ {
        if nums[i] != i+1 {
            return i + 1
        }
    }
    // 如果数组是连续的,则返回数组长度加1
    return length + 1
}

代码解释

  1. 遍历数组,将每个正整数 nums[i] 放到其应该在的位置 nums[nums[i] - 1]
  2. 再次遍历数组,找到第一个不在其正确位置上的数字,返回其索引加1作为结果。

这个算法的时间复杂度为 O(n),其中 n 是数组的长度。

相关推荐
hans汉斯几秒前
《软件工程与应用》期刊推荐&10月版面征稿中
图像处理·人工智能·深度学习·算法·音视频·软件工程
叠层归一研究院14 分钟前
AGI 系统(八):符号范畴嵌入函子 — SymCat ↪ C_M107 严格化
c语言·开发语言·人工智能·算法·transformer·agi
其美杰布-富贵-李1 小时前
08 进阶评估指标与算法特定指标
人工智能·算法
.道阻且长.2 小时前
5.LeetCode算法习题讲解--双指针--有效三角形的个数
算法·leetcode·职场和发展
我是海飞2 小时前
杰理JL703N SSD1306 OLED(128x64) 点阵屏移植说明
单片机·算法·嵌入式·音频·杰理
wabs6663 小时前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
wuyk5554 小时前
2.队列:先进先出的线性数据结构
c语言·数据结构·stm32·单片机
lsylalalala5 小时前
常见的排序算法1
数据结构·算法·排序算法
名字还没想好☜5 小时前
Go 的 unsafe.Pointer 实战:零拷贝 []byte↔string 转换与三条铁律
开发语言·后端·golang·go·unsafe
想吃火锅10055 小时前
【leetcode】54. 螺旋矩阵
算法·leetcode·矩阵