博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
41. 缺失的第一个正数
阅读量:6269 次
发布时间:2019-06-22

本文共 1107 字,大约阅读时间需要 3 分钟。

问题

问题描述

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

说明

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。


解答

首先因为只能使用常数级别的空间,就不能再建新的O(n)级的list,set等。然后就想到将列表去重去除非正数排序,最后循环当nums[i]和(i+1)不等是输出。

class Solution:    def firstMissingPositive(self, nums):        """        :type nums: List[int]        :rtype: int        """        nums = list(set([i for i in nums if i > 0]))        nums.sort()        for i in range(len(nums)):            if nums[i] != i + 1:                return i + 1        return len(nums) + 1

但是这样写并不正确。原因就在于使用的Python内置的函数的复杂度超过的O(n), 比如sort()的复杂度就是O(nlogn)。详细资料可以参考

经过思考,只需要将列表中在列表长度范围内的正整数n移动到列表(n-1)的位置,然后再循环当nums[i]和(i+1)不等是输出。

class Solution:    def firstMissingPositive(self, nums):        """        :type nums: List[int]        :rtype: int        """        k = len(nums)        if k == 0:            return 1        for i in range(k):            while 0 < nums[i] <= k and nums[i] != nums[nums[i] - 1]:                a = nums[nums[i] - 1]                nums[nums[i] - 1] = nums[i]                nums[i] = a        for i in range(k):            if nums[i] != i + 1:                return i+1        return k + 1

转载地址:http://bkvpa.baihongyu.com/

你可能感兴趣的文章
通过layout实现可拖拽自动排序的UICollectionView
查看>>
服务器错误码
查看>>
javascript中的面向对象
查看>>
Splunk作为日志分析平台与Ossec进行联动
查看>>
yaffs文件系统
查看>>
Mysql存储过程
查看>>
NC营改增
查看>>
Lua
查看>>
Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录
查看>>
postgresql 获取刚刚插入的数据主键id
查看>>
C# Activex开发、打包、签名、发布 C# Activex开发、打包、签名、发布 [转]
查看>>
05-Vue入门系列之Vue实例详解与生命周期
查看>>
验证码展示
查看>>
浅谈大型web系统架构
查看>>
淘宝大秒系统设计详解
查看>>
linux如何修改登录用户密码
查看>>
Kali Linux 2017中Scapy运行bug解决
查看>>
Python监控进程性能数据并画图保存为PDF文档
查看>>
Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法
查看>>
Mac OS 10.10.3下Apache + mod_wsgi配置【一】
查看>>