「力扣268」丢失的数字

112 阅读1分钟

题目

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例

输入: nums = [3,0,1]
输出: 2
解释: n = 3
因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

原题链接

丢失的数字

思路

全数组[0,n]公差1递增形成的数组,nums全数组少了1个数字的形成的数组。所以,用全数组之和减去nums之和就能得到丢失的那个数字。

步骤

一、计算全数组所有数字之和

  1. 等差数列的前n项和: (首项+尾项) * 项数 / 2 = (a1+an) * N / 2
  2. 求关键值:
    • 首项 a1 = 0
    • 尾项 an = nums.length (全数组0开始,按公差1递增排列,一共nums.length+1个数字,所以尾项的值是nums.length)
    • 项数 N = nums.length+1 (题目给出的条件)

二、计算 nums 所有数字之和

通过 Array.prototype.reduce 计算数组的和。

三、计算丢失的数字

全数组nums只差了 1 个数字,所以 全数组之和 减去 nums之和 即丢失的那个数字。

代码

TypeScript

function missingNumber(nums: number[]): number {
    const n = nums.length;
    const total = (0 + n) * (n+1) / 2;
    const sum = nums.reduce((pre, cur) => pre + cur, 0);

    return total - sum;
};

C++

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        // 全数组之和
        int total = (0 + n) * (n+1) / 2;
        // nums之和
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += nums[i];
        }

        return total - sum;
    }
};