博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode:First Missing Positive
阅读量:6034 次
发布时间:2019-06-20

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

Given an unsorted integer array, find the first missing positive integer.

For example,

Given [1,2,0] return 3,
and [3,4,-1,1] return 2.

Your algorithm should run in O(n) time and uses constant space

寻找数组中缺失的最小正整数


算法1

首先最容易想到的是:先对数组排序,然后在查找,但是这样不满足线性时间要求。以下代码oj还是能通过的

class Solution {public:    int firstMissingPositive(int A[], int n) {        sort(A, A+n);        int k = 1;        for(int i = 0; i < n; i++)            if(A[i] < k);//为了处理小于1的数 或者 处理连续出现相同的数            else if(A[i] != k)return k;            else k++;        return k;    }};


算法2

使用哈希表来记录某个数字是否出现过(当然也可以使用bitmap)。这样的话空间复杂度和int的最大值有关

class Solution {public:    int firstMissingPositive(int A[], int n) {        unordered_set
uset; for(int i = 0; i < n; i++) if(A[i] > 0)uset.insert(A[i]); for(int i = 1; ;i++) if(uset.count(i) == 0)return i; }};


算法3

注意到大小为n的数组,缺失的最小正整数一定在范围[1,n+1]内,因此改进一下算法2,可以使用大小为n+1的哈希表。空间复杂度是O(n),不符合题意

class Solution {public:    int firstMissingPositive(int A[], int n) {        vector
hashtable(n+2, 0);//hashtable[i] = 1表示数字i出现过 for(int i = 0; i < n; i++) if(A[i] > 0 && A[i] <= n+1)hashtable[A[i]] = 1; for(int i = 1; i <= n+1; i++) if(hashtable[i] == 0)return i; }};


算法4

上述算法3中,我们可以用数组本身来充当哈希表。稍微变通一下,在遍历数组的过程中把数字 i 放在A[i-1]的位置。最后如果A[k] != k+1就说明k+1这个数字没有出现过。由于数组的大小是n,因此如果原始数组中的数字是1,2…n,则最后应该返回n+1。

还需要注意的是if中判断条件:A[i] != A[A[i]-1];即如果某个位置A[i]已经放置了i+1或者数字A[i]即将要放入的位置(A[A[i]-1])原本就是A[i],则跳过。这样可以避免出现死循环(如数组[1,2]和[1,1])                         

class Solution {public:    int firstMissingPositive(int A[], int n) {        for(int i = 0; i < n; )            if(A[i] > 0 && A[i] <= n && A[i] != A[A[i]-1])                swap(A[i], A[A[i]-1]);            else i++;        for(int i = 0; i < n; i++)            if(A[i] != i+1)return i+1;        return n+1;    }};

 

 

【版权声明】转载请注明出处:

转载于:https://www.cnblogs.com/TenosDoIt/p/3770051.html

你可能感兴趣的文章
固定弹层叉掉
查看>>
[编解码] 关于base64编码的原理及实现
查看>>
WinDbg配置和使用基础
查看>>
转:Object-Runtime的基本数据类型
查看>>
JMJS系统总结系列----Jquery分页扩展库(五)
查看>>
Excel技巧之——英文大小写转换(转)
查看>>
Google 翻译的妙用
查看>>
算法导论--python--插入排序
查看>>
Hydra用户手册
查看>>
常用的集合
查看>>
Unity3D工程源码目录
查看>>
杀死进程命令
查看>>
cookie 和session 的区别详解
查看>>
浮点数网络传输
查看>>
Mongodb对集合(表)和数据的CRUD操作
查看>>
面向对象类的解析
查看>>
tomcat如何修改发布目录
查看>>
CentOS 5.5 使用 EPEL 和 RPMForge 软件库
查看>>
Damien Katz弃Apache CouchDB,继以Couchbase Server
查看>>
Target runtime Apache Tomcat is not defined.错误解决方法
查看>>