每日一题- day2
新手入坑LeetCode,每天打卡一道题
算法不一定很好,只是我自己的一个水平体现,做个自己刷题的记录,欢迎交流学习
(尽量AC LeetCode官方的每日一题)
欢迎交流学习!
题目:面试题 17.19. 消失的两个数字
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。
思路:
数学方法:
- 求出数组完整时的总和
totalSum
- 减去数组的所有元素,得到缺失的两数之和
sumTwo
- 定义
mid
为两数之和的 1/2,即mid = sumTwo / 2
- 求出[1,mid]的范围内的 总和
nSum = (mid + 1) * mid / 2
- 再次遍历数组,将[1,mid]的元素减去,剩下的结果为 缺失的两个元素中的
较小值
,很容易求出较大值
代码:
class Solution {
public:
vector<int> missingTwo(vector<int>& nums) {
int n = nums.size() +2;//完整数组的长度
int totalSum = n * (n + 1) / 2;//完整数组的总和
for(int i = 0; i < n - 2; i ++){
totalSum -= nums[i];
}
int sumTwo = totalSum;//缺失的两数之和
int mid = sumTwo / 2;//和的平均值:一大一小
int Nsum = mid * (mid + 1) / 2;//1+...+平均值的总和
for(int i = 0; i < n - 2; i ++){
if(nums[i] <= mid) Nsum -= nums[i];//到mid为止,左侧左侧出现的差就是较小值,同理,右侧为较大值
}
return {Nsum, sumTwo - Nsum};//返回两数
}
};