• First Missing Positive


    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 constantspace.

     

    思路:寻找数组中“丢失”的第一个正整数,意思就是,如果对于正整数序列1,2,3,…,查看该数组缺失的第一个正整数。要求时间复杂度为O(n),空间复杂度为O(1)。


    如果没有时间复杂度和空间复杂度的限制,解决该题,第一个想到的就是排序,排序后就可在O(n)的时间内找到缺失的第一个整数。但是一般的排序算法最快也是O(nlogn)的。


    算法导论中介绍了时间复杂度为O(n)的排序算法,这种排序算法必须满足一定的条件,比如数据的范围固定在一个较小区间内,即可按照数据本身的值进行排序(哈希)。


    本题其实也符合这种条件,对于长度为size的数组,则其最多能包含的完整序列也就是1,2,…,size。对于数组中大于size的整数,以及小于1的整数,完全不用关心,只需要关心1,2,…,size范围内的整数。将该范围内的整数,按照他们的值放在相应的位置上,将该范围之外的值直接置为0。然后从前往后扫描一遍数组,第一个值为0的数组元素的索引,即是结果。


    该过程中要注意重复数据的问题。代码如下:

     
    int firstMissingPositive(int* nums, int numsSize)
    {
        int i, tmp;
        for(i = 0; i < numsSize; i++)
        {
            tmp = nums[i];
            while(tmp != i+1)
            {
                if(tmp > numsSize || tmp < 1 || tmp == nums[tmp-1])
                {
                    nums[i] = 0;
                    break;
                }
                nums[i] = nums[tmp-1];
                nums[tmp-1] = tmp;
                tmp = nums[i];
            }
        }
        for(i = 0; i < numsSize; i++)
        {
            if(nums[i] == 0)    return i+1;
        }
        return numsSize+1;
    }


     

  • 相关阅读:
    java(JDBC连接数据库)[完整版封装]
    java(JDBC连接数据库)[对Statement进行封装]
    HTML基础(DTD & 注释 &常见HTML编码)
    HTML基础(基本结构)
    HTML基础(格式标签)
    java(安全方便的从控制台读入数据)[对Scanner类进行封装,用正则表达式判断]
    java(JDBC连接数据库)[对PreparedStatement进行封装]
    for循环
    什么是操作系统
    字符串内置方法
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7247139.html
Copyright © 2020-2023  润新知