【leetcode】First Missing Positive(hard) ☆

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放到位置0,2放到位置1。直到当前位置的数字变成正确的数字。如果遇到小于0的数字或者大于元素个数的数字跳过,因为如果后面有对应位置的数字的话是会换过来的。

代码:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        for(int i = 0; i < nums.size(); ++i)
        {
            while(nums[i] > 0 && nums[i] <= nums.size() && nums[nums[i] - 1] != nums[i]) //其实这里不要nums[i] > 0 也可以 就是会慢一点
                swap(nums[i], nums[nums[i] - 1]);  //交换数字 直到当前位置数字正确 或者 数字无法按序放在当前矩阵中
        }

        int i;
        for(i = 0; i < nums.size(); ++i)
        {
            if(nums[i] != i + 1)
                break;
        }
        return i + 1;
    }
};
原文地址:https://www.cnblogs.com/dplearning/p/4466192.html