题目
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
示例
输入: nums = [3,0,1]
输出: 2
解释: n = 3
因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。
原题链接
思路
全数组是[0,n]按公差1递增形成的数组,nums是全数组少了1个数字的形成的数组。所以,用全数组之和减去nums之和就能得到丢失的那个数字。
步骤
一、计算全数组所有数字之和
- 等差数列的前
n项和:(首项+尾项) * 项数 / 2 = (a1+an) * N / 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;
}
};