题目
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。
示例 1:
输入: [1]
输出: [2,3]
示例 2:
输入: [2,3]
输出: [1,4]
提示:
nums.length <= 30000
解题
方法一:数学
思路
由题意:设缺失的两个数分别为 、 (),给定数组 nums
长度为 且缺少了 个数,那么完整数组的长度 其中的元素为 。
根据 的求和公式可得完整数组中所有数之和为 ,而现有数组 nums
中数之和为 ,那缺失两数之和 ,这时求出其中一个缺失的数另一个数也可求得。
而完整数组中每个数均不相同,也就是说 (令 ): 且 。
那么我们就可以求出 的和,再拿它减去 就能得到较小的一个缺失的数(x
),剩下的 。
于是返回 。
代码
class Solution {
public int[] missingTwo(int[] nums) {
int n = nums.length + 2;
int full = n * (n + 1) / 2, total = 0;
for (int num : nums) total += num;
int twoSum = full - total, lower = twoSum / 2;
int x = lower * (lower + 1) / 2;
for (int num : nums) {
if (num <= lower) x -= num;
}
return new int[]{x, twoSum - x};
}
}
class Solution {
public:
vector<int> missingTwo(vector<int>& nums) {
int n = nums.size() + 2;
int full = n * (n + 1) / 2, total = 0;
for (int& num : nums) total += num;
int two_sum = full - total, lower = two_sum / 2;
int x = lower * (lower + 1) / 2;
for (int& num : nums) {
if (num <= lower) x -= num;
}
return {x, two_sum - x};
}
};
时间复杂度:
空间复杂度:
评论区