每日一题- day2

每日一题- day2

新手入坑LeetCode,每天打卡一道题
算法不一定很好,只是我自己的一个水平体现,做个自己刷题的记录,欢迎交流学习
(尽量AC LeetCode官方的每日一题)
欢迎交流学习!

题目:面试题 17.19. 消失的两个数字

给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。

思路:

数学方法:

  1. 求出数组完整时的总和 totalSum
  2. 减去数组的所有元素,得到缺失的两数之和 sumTwo
  3. 定义 mid 为两数之和的 1/2,即 mid = sumTwo / 2
  4. 求出[1,mid]的范围内的 总和nSum = (mid + 1) * mid / 2
  5. 再次遍历数组,将[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};//返回两数
    }
};

猜你喜欢

转载自blog.csdn.net/Nmj_World/article/details/127058412