给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/missing-number
解法
缺失的数字m = sum(0...n) - sum(nums).
但是注意计算sum的时候可能会溢出,可以使用long long,如果不想使用long long的话,也可以将上述公式演变一下:
缺失的数字m =
sum(0...n) - sum(nums) =
(0 - nums[0]) + (1 - nums[1]) + ... + n
边加边减,防止溢出。
然而,即便这样也是可能溢出的。在最差的情况下,nums为序列(n,n-1,...,1),那么上述累加过程中所出现的j绝对值最大值是:
(0 - n) + (1 - (n-1)) + ... = -(n + n - 2 + n - 4 + ... ) ≈ (-1 < C < 0)
n足够大的情况下,也是会溢出的,不过我赌1毛钱n是一个较小值,毕竟往nums塞那么多个元素也不容易,是不。
啦啦啦~
代码:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int m = nums.size();
for (size_t i = 0; i < nums.size(); ++i)
{
m += (static_cast<int>(i) - nums[i]);
}
return m;
}
};
欢迎关注【CPP笔记】