Leetcode (41) First Missing Positive

来源:互联网 发布:下载伴奏的软件 编辑:程序博客网 时间:2024/05/05 14:49

Leetcode (41) 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 constant space.

  • 题意:给定一个乱序的整数数组,要求找到数组中第一个缺少的正数
  • 需要考虑到的点:
    1. 数组是乱序的
    2. 数组中会有负数
    3. 缺少的整数不一定在中间缺少还有可能是最后一个,如[0,1,2,3],则应回答4
    4. 中间可能缺少好多个整数,如[1,2,5,6,7],都是可能的,但是正确答案是3
    5. 中间可能有重复的整数,如[0,2,2,2,2]
    6. 时间复杂度要是O(n),空间复杂度要是O(1)
  • 思路:

    1. 时间复杂度要求是O(n),因此不能使用基于比较大小的排序方法,而要得到正解,则必须知道数组中有什么数,即只能够将数据遍历几遍就得到结果
    2. 空间复杂度为O(1),也就是说,如桶排序的思想不能直接使用了
    3. 要找到第一个缺失的正整数,排序是最方便直接的方式,但是不满足时间复杂度要求,那么可以考虑不完全的排序
    4. 由于缺失的正整数,一定小于或等于数组的长度(等于的情况只有一种就是缺失的数在尾部),同时比它小的数也都是在数组范围内,那么按照排序的思想,它们应该放到数组的前面去,进一步,桶排序的最简单的思想就是将数按照索引放好,那么遍历一遍数组的即可完成,但是要满足空间复杂度就需要一种交换策略,保证空间复杂度满足的同时,防止程序陷入死循环
  • 代码如下:

class Solution {public:    int firstMissingPositive(vector<int>& nums) {        int i=0,size = nums.size();        while (i<size)        {            if (nums[i] >= 0 && nums[i] < size && nums[nums[i]] != nums[i])                swap(nums[nums[i]],nums[i]);            else i++;        }        int k = 1;        while (k < size && nums[k]==k)            k++;        if (size == 0 || k < size)            return k;        else return nums[0] == k?k+1:k;    }};
0 0
原创粉丝点击