美文网首页
First Missing Positive

First Missing Positive

作者: 瞬铭 | 来源:发表于2019-04-01 19:12 被阅读0次

https://leetcode.com/problems/first-missing-positive/
Your algorithm should run in O(n) time and uses constant extra space.

显然这是一个投机取巧的办法,因为并没有O(n)的时间复杂度,但是居然ac了

    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function firstMissingPositive($nums) {
        for ($i = 1; ; $i++) {
            if (!in_array($i, $nums)) {
                return $i;
            }
        }
    }

但是上面的解法不是O(1)的空间复杂度,所以我们需要另想一种解法,既然不能建立新的数组,那么我们只能覆盖原有数组,我们的思路是把1放在数组第一个位置nums[0],2放在第二个位置nums[1],即需要把nums[i]放在nums[nums[i] - 1]上,那么我们遍历整个数组,如果nums[i] != i + 1, 而nums[i]为整数且不大于n,另外nums[i]不等于nums[nums[i] - 1]的话,我们将两者位置调换,如果不满足上述条件直接跳过,最后我们再遍历一遍数组,如果对应位置上的数不正确则返回正确的数,代码如下:参考

  function firstMissingPositive2($nums) {
        $n = count($nums);
        for ($i = 0; $i < $n; $i++) {
            while ($nums[$i] > 0 && $nums[$i] <= $n && $nums[$nums[$i] - 1] != $nums[$i]) {
                $idx = $nums[$i] - 1;
                $tmp                 = $nums[$i];
                $nums[$i]            = $nums[$idx];
                $nums[$idx] = $tmp;
            }
        }

        for ($i = 0; $i < $n; $i++) {
            if ($nums[$i] != $i + 1) {
                return $i + 1;
            }
        }
        return $n + 1;
    }

相关文章

网友评论

      本文标题:First Missing Positive

      本文链接:https://www.haomeiwen.com/subject/ffmvbqtx.html