【leetcode】First Missing Positive

1、题目

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.

2、分析

注意,[6,4,5]缺的第一个是1,[1,2,3]缺的第一个是4。多考虑几个测试用例,有助于自己对题目的理解。
本题我想到的第一种是用哈希表的方法,思路如下面方法一中所述,非常简单,当然,空间复杂度O(n),不符合要求。

第二种方法,利用桶排序的思想,交换数组元素,使得数组中第i位存放的数值为(i+1),即当A[i]!=i+1时,交换A[i]和A[A[i]-1](直到没法交换为止,什么情况才算是没法交换?当A[i]<=0或A[i]>n时,A[i]-1就超出了数组边界,此时没法交换,当A[i]==A[A[i]-1]时,不用交换,也不能交换,否则造成程序死循环)。最后再判断数组中的一个A[i]不等于i+1的,返回i+1


3、代码

#方法一

哈希表

<span style="font-size:18px;">class Solution {
public:
    /*
    建立一个哈希表Map<int,bool>,遍历一轮,将数组中有出现的数字(忽略负数)作为key,其val置为true,并且在这一轮遍历中,记下最小的数minnum
    如果minnum不为0和1,则缺少的第一个正数就是1
    其他情况,则从minnum开始,在哈希表中查找是否有该数,有的话,minnum++并继续查找,直到在哈希表中找不到minnum,输出该数
    */
    int firstMissingPositive(int A[], int n) {
      //  if(n==0) return 1;
        map<int,bool> Map;
        int minnum=1;
        for(int i=0;i<n;i++)
        {
            if(A[i]>=0) 
            {
            Map[A[i]]=true;
            minnum=minnum>A[i]?A[i]:minnum;
            }
        }
        if(minnum!=1&&minnum!=0) return 1;
        while(Map.find(minnum)!=Map.end()) minnum++;
        return minnum; 
    }
};</span>


#方法二

桶排序的思想

<span style="font-size:18px;">class Solution {
public:
    int firstMissingPositive(int A[], int n) {
      bucket_sort(A,n);
      for(int i=0;i<n;i++)
      {if(A[i]!=i+1)   return i+1;}
      return n+1;
    }
private:
     void bucket_sort(int A[],int n)
     {
         for(int i=0;i<n;i++)
           while(A[i]!=i+1)
           {   
               if(A[i]<=0 || A[i]>n || A[i]==A[A[i]-1] ) break;  //这三种情况都不能swap
               swap(A[i],A[A[i]-1]);
           }
     }
};</span>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值