268. 丢失的数字
方法一、键值交换
思路
这个题很容易想到借助一个单独的hash表来做,但时并不能满足进阶要求中的空间复杂度要为O(1)。所以不能借助新的辅助数组。
键值交换
- 数组 key ,value 交换位置;
 - 遍历交换后的数组,判断哪个key没有,即为缺失的值。
 
PS:此法用下列代码维持O(1)的空间复杂度,有些取巧的嫌疑。操作整型数组变成关联数组,这在PHP可以说得通。对于强类型语言来说,就很难实现了,并不能保证O(1)的空间复杂度。
$nums['L'.$nums[$i]] = $i;
unset($nums[$i]);
复杂度
时间复杂度:O(n)
空间复杂度:O(1)
代码
class Solution {
    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function missingNumber($nums) {
        // 键值交换
        for($i = 0; $i < count($nums); $i++) {
            $nums['L'.$nums[$i]] = $i;
            unset($nums[$i]);
        }
        // 遍历判断key是否存在
        for($i = 0; $i <= count($nums); $i++) {
            if(!isset($nums['L'.$i])) return $i;
        }
    }
}
方法二、数学法
思路
利用高斯求和公式。
nums 是包含 [0, n] 的 n 个元素的数组,有一个 [0, n] 范围数没出现在这个数组中。
计算 0,1,2,3……n-1,n 数列的和,然后减去 nums 数组整数和,则得到缺失数字的值。
复杂度
时间复杂度:O(n)
空间复杂度:O(1)
代码
class Solution {
    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function missingNumber($nums) {
        $n = count($nums);
        $sum = (1 + $n) * $n / 2;
        return $sum - array_sum($nums);
    }
}