找到缺失的 第一个正数

简介: 找到缺失的 第一个正数

找到缺失的 第一个正数(算法题)

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

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

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

示例1:

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

示例2:

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

示例2:

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

提示:

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

思路

如果本题没有额外的时空复杂度要求,那么就很容易实现:

我们可以将数组所有的数放入哈希表,随后从 1 开始依次枚举正整数,并判断其是否在哈希表中;

我们可以从 1 开始依次枚举正整数,并遍历数组,判断其是否在数组中。

如果数组的长度为 N,那么第一种做法的时间复杂度为O(N),空间复杂度为 O(N);第二种做法的时间复杂度为 O(N^2),空间复杂度为 O(1)。但它们都不满足时间复杂度为 O(N)且空间复杂度为O(1)。

「真正」满足时间复杂度为 O(N) 且空间复杂度为O(1) 的算法是不存在的,但是我们可以退而求其次:利用给定数组中的空间来存储一些状态。也就是说,如果题目给定的数组是不可修改的,那么就不存在满足时空复杂度要求的算法;但如果我们可以修改给定的数组,那么是存在满足要求的算法的。

具体的解析,大家可以参考力扣41题。

public class Solution {

    public int firstMissingPositive(int[] nums) {
        int len = nums.length;

        for (int i = 0; i < len; i++) {
            while (nums[i] > 0 && nums[i] <= len && nums[nums[i] - 1] != nums[i]) {
                // 满足在指定范围内、并且没有放在正确的位置上,才交换
                // 例如:数值 3 应该放在索引 2 的位置上
                swap(nums, nums[i] - 1, i);
            }
        }

        // [1, -1, 3, 4]
        for (int i = 0; i < len; i++) {
            if (nums[i] != i + 1) {
                return i + 1;
            }
        }
        // 都正确则返回数组长度 + 1
        return len + 1;
    }

    private void swap(int[] nums, int index1, int index2) {
        int temp = nums[index1];
        nums[index1] = nums[index2];
        nums[index2] = temp;
    }
}
相关文章
|
JavaScript 前端开发 安全
ts中的类型定义的详细使用教程
ts中的类型定义的详细使用教程
363 0
|
存储 Java Android开发
Android插件化动态加载apk
支付宝作为一个宿主apk提前将要集成的apk作为一个插件(plugin)下载到本地,然后当使用该plugin(apk)的时候再去加载对应plugin(apk)的资源文件以及对应的native页面。就是不去安装plugin(apk)就可以直接运行该plugin(apk)中的页面。
1241 0
|
canal 监控 关系型数据库
canal的特点是什么?如何使用?
【10月更文挑战第23天】canal的特点是什么?如何使用?
764 3
|
XML 存储 PyTorch
基于Pytorch的从零开始的目标检测 | 附源码
基于Pytorch的从零开始的目标检测 | 附源码
|
机器学习/深度学习 人工智能 自然语言处理
|
数据中心
Cat5 与 Cat5e:两种网线的区别和比较
Cat5 与 Cat5e:两种网线的区别和比较
1330 1
Cat5 与 Cat5e:两种网线的区别和比较
|
机器学习/深度学习 存储 弹性计算
阿里云gpu云服务器最新收费标准及活动价格参考
阿里云gpu云服务器多少钱?目前阿里云gpu云服务器最低仅需939.77元/1周,月付最低1684.00元/1个月起,年付最低16172.40元/1年起。阿里云GPU云服务器是基于GPU应用的计算服务,多适用于视频解码,图形渲染,深度学习,科学计算等应用场景,该产品具有超强计算能力、网络性能出色、购买方式灵活、高性能实例存储( GA1和GN5特有)等特点。下面小编来介绍下阿里云gpu云服务器最新的收费标准及活动价格。
阿里云gpu云服务器最新收费标准及活动价格参考
|
测试技术 开发工具 开发者
智能编程的未来:通义灵码全功能评测
本文全面评测了通义灵码,一款智能代码撰写助手。从便捷的安装体验到高效的代码续写能力,通义灵码表现出色。它不仅能生成和解释代码,还能自动撰写单元测试,有效解答编程问题,并提供准确的错误分析。这些功能共同提升了编程效率,尤其对于新手和经验丰富的开发者都是极大的帮助,使其成为值得尝试的工具。
1977 0
智能编程的未来:通义灵码全功能评测
|
消息中间件 SQL 存储
基于 Flink 流计算实现的股票交易实时资产应用
第四届实时计算 Flink 挑战赛最佳实践奖-海克斯科技的项目文章。
基于 Flink 流计算实现的股票交易实时资产应用
|
API 区块链 数据安全/隐私保护
【Web3 探索】如何快速获取 PancakeSwap 交易数据?
PancakeSwap是Binance Smart Chain上受欢迎的去中心化交易所,了解其交易数据对于开发人员和交易者都很重要。在本指南中,我们将探讨如何使用GraphQL检索PancakeSwap的交易数据。
802 0
【Web3 探索】如何快速获取 PancakeSwap 交易数据?

热门文章

最新文章