【面试题】缺失的第一个整数

简介: 【面试题】缺失的第一个整数

缺失的第一个整数

仅供学习,如果有错误请指正

本文实现的代码时间复杂度是 O(n log n),不满足题目要求

一、问题描述


排序的时间复杂度通常是 O(n log n),但我们可以采用一种原地排序算法(如快速排序),在最坏情况下仍保持 O(n log n) 的时间复杂度。

二、解题思路

2.1 排序

首先对数组进行排序。这将允许我们线性地扫描数组以找到缺失的最小正整数。排序的时间复杂度通常是 O(n log n),但我们可以采用一种原地排序算法(如快速排序),在最坏情况下仍保持 O(n log n) 的时间复杂度。

2.2 填充

遍历排序后的数组,对于每个索引 i,如果 nums[i] 不等于 i + 1,则返回 i + 1 作为结果。这是因为排序后的数组中,索引 i 应该包含的值是 i + 1。如果实际值不等于期望值,说明 i + 1 没有出现在数组中。

2.3 特殊情况

如果数组中所有元素都满足 nums[i] == i + 1,那么最小的未出现的正整数将是数组长度加一。

三、Python代码

def firstMissingPositive(nums):
    # 原地排序
    nums.sort()

    # 遍历排序后的数组
    missing_positive = 1
    for i in range(len(nums)):
        # 如果当前元素不等于其索引加1
        if nums[i] < 1:
            continue

        if nums[i] != missing_positive:
            # 返回当前索引加1
            return missing_positive
        missing_positive = missing_positive + 1

    return missing_positive
相关文章
|
4月前
|
Python
2024年最新【Python】常见的 数据类型:整数类型,Python面试题整理最新
2024年最新【Python】常见的 数据类型:整数类型,Python面试题整理最新
2024年最新【Python】常见的 数据类型:整数类型,Python面试题整理最新
|
4月前
|
算法
【一刷《剑指Offer》】面试题 11:数值的整数次方
【一刷《剑指Offer》】面试题 11:数值的整数次方
|
4月前
|
算法 Java
【力扣经典面试题】12. 整数转罗马数字
【力扣经典面试题】12. 整数转罗马数字
|
4月前
|
人工智能 算法 Java
数据结构与算法面试题:给定 n 个非负整数 a1,a2,a3,...,an,每个数代表坐标中的一个点(i, ai),请找出两个点之间的最大距离。(提示:动态规划)
数据结构与算法面试题:给定 n 个非负整数 a1,a2,a3,...,an,每个数代表坐标中的一个点(i, ai),请找出两个点之间的最大距离。(提示:动态规划)
73 1
|
4月前
|
存储 算法 Java
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
67 0
|
4月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
70 0
|
4月前
面试题 05.06:整数转换
面试题 05.06:整数转换
26 0
|
存储 Java
LeetCode150道面试经典题--罗马数字转整数(简单)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。其按规律组合成一个罗马数字后将其转换成整数并输出。
61 0
|
存储 算法 Java
【算法】阿里面试题-编码实现20亿个整数,找出某个数X是否存在其中
【算法】阿里面试题-编码实现20亿个整数,找出某个数X是否存在其中
【算法】阿里面试题-编码实现20亿个整数,找出某个数X是否存在其中
|
算法
剑指Offer - 面试题16:数值的整数次方
剑指Offer - 面试题16:数值的整数次方
44 0