41. 缺失的第一个正数

时间复杂度低,可考虑哈希表,但是考虑空间复杂度,只能用想其他办法。

可以通过将每个正数放在适合的位置,然后检查是否第一个位置对应不上的数就是第一个正数。

实际执行时遇到两个问题:

1.有时候出错了。是因为交换位置后,被换到前面的数字可能还没复位,所以导致没有放在对应的位置上。

  解决方法:交换位置后,指针停留一下。

2.上面方法导致了另一个问题:当两个位置数字一样时候,进入无限循环。

  解决方法:交换前判断是否相等,不相等时候再交换。

int firstMissingPositive(vector<int>& nums) {
    int length = nums.size();
    for (int i = 0; i < length; i++)
    {
        if (nums[i] > 0 && nums[i] != i + 1  && nums[i] < length)
        {
            if (nums[i] != nums[nums[i] - 1])
            {
                std::swap(nums[i], nums[nums[i] - 1]);
                if (i > 0) i--;
            }

        }

    }
    for (int i = 0; i < length;i++)
    if (nums[i] != i + 1)
        return i + 1;
    return length+1;
}
原文地址:https://www.cnblogs.com/Oscar67/p/9265307.html