LeetCode题目笔记——17.19消失的两个数字

2023-11-20

题目描述

题目直达
在这里插入图片描述

题目难度——困难

方法一:暴力

  虽然题目说你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 但是也没有限制我们不能用暴力,而且题目也给了nums的长度最多也就30000,那么暴力遍历一遍应该也用不了多少时间。至于空间,需要用到O(N),首先新建一个包含1到N的数组,然后给输入数组填补两个0,让他们长度对其。注意题目没有说输入数组是有序的,所以还需要对nums进行排序。最后再遍历两个数组进行比对,就能找到缺失的答案了。

代码

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        vector<int> res;
        vector<int> tmp(nums.size() + 2);
        for(int i = 0; i < nums.size() + 2; i++){
            tmp[i] = i + 1;
        }
        sort(nums.begin(), nums.end());
        nums.push_back(0);
        nums.push_back(0);
        for(int i = 0, j = 0; i < nums.size();){
            if(nums[i] != tmp[j]){
                res.push_back(tmp[j]);
                j++;
            }
            else if(nums[i] == tmp[j]){
                i++;
                j++;
            }
            if(res.size() == 2){
                break;
            }
        }
        return res;
    }
};

代码优化

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        vector<int> res;
        int tmp[nums.size() + 2];
        for(int i = 0; i < nums.size() + 2; i++){
            tmp[i] = i + 1;
        }
        sort(nums.begin(), nums.end());
        nums.push_back(0);
        nums.push_back(0);
        for(int i = 0, j = 0; res.size() != 2; j++){
            if(nums[i] != tmp[j]){
                res.push_back(tmp[j]);
            }
            else{       // else it must be the same
                i++;
            }
        }
        return res;
    }
};

方法二——数学方法

  既然缺失两个数AB,那么输入数组的总和与1到N的总和之间的差一定是缺失的那两个数之和。我们只需要先获得这两个和的差,即A+B=Sum(1,…N)-Sum(nums)。然后用两个指针从从A+B的中间开始往两边走,找到不在nums里的那两个数就是答案。因此需要额外借助一个字典或者集合来存储nums。

代码

class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        vector<int> res;
        unordered_map<int, int> table;
        for(int i = 0; i < nums.size(); i++){
            table[nums[i]] = nums[i]; 
        }
        int N = nums.size() + 2;
        int diff = (1 + N) * N / 2 - accumulate(nums.begin(), nums.end(), 0);
        int left = diff / 2;
        int right = diff - left;
        while (res.size() != 2){
            if(!table.count(left) && !table.count(right)){
                res.push_back(left);
                res.push_back(right);
            }
            --left;
            ++right;
        }
        return res;
    }
};

总结

  两种方法都比官方题解中的位运算方法要慢,第一种由于用到了sort,所以时间是O(NlogN),空间是O(N),第二种最坏情况下缺失的数字是1和N,那就要遍历N/2次,所以时间也是O(N)。额外的空间如果使用map来进行查找的话,是O(logN),set也是O(logN),总之第二种方法也是时间和空间都是O(N)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode题目笔记——17.19消失的两个数字 的相关文章

随机推荐

  • systemd[1]: Failed to load SELinux policy. freezing.

    今天早上发现centos7无法启动了 界面提示systemd 1 Failed to load SELinux policy freezing 查到一篇资料说是selinux设置出问题了 他将 etc selinux config文件中的s
  • MATLAB进行模式识别的实验

    一 实验一习题 我猜测是根据最大似然估计法先求出那两个参数的值 然后代入 得到的是只关于x的函数 然后把文本里的1000个数据导入 画图 首先 我先把txt的数据读取到矩阵里面 方便后续处理 用到的函数 1 这里有一个比较详细的fopen的
  • docker部署war包、将容器打包成镜像、镜像导出到本地、镜像推送到dockerhub

    前言 最近公司使用帆软 finereport 报表工具制作数据报表 并且需要将制作好的报表打包成war包通过docker部署 并且将部署好的项目制作成docker镜像 发给客户 下面将部署过程中踩的坑总结一下 想要了解帆软可以点击官方链接查
  • 图片上传服务器系统说明

    图片服务器测试用例 图片上传服务器系统说明 数据库设计 drop database if exists drawing bed create database drawing bed character set utf8mb4 use dr
  • 东风小康为什么是dfsk_自吸这么“香”,为什么现在新车都是涡轮增压

    知乎视频 www zhihu com 开车不带 T 干啥都没劲 车子用了涡轮增压能够显著提升动力 能把一台 能用 的车变成 好用 的车 并且国内的排放法规也越来越严格 使用涡轮增压的同时 也具备了一些节能减排的效果 所以说 自然吸气的车越来
  • Multihead Attention - 多头注意力

    文章目录 多头注意力 模型 实现 小结 多头注意力 在实践中 当给定 相同的查询 键和值的集合 时 我们希望模型可以基于相同的注意力机制学习到不同的行为 然后将不同的行为作为知识组合起来 捕获序列内各种范围的依赖关系 例如 短距离依赖和长距
  • [3dsMax]2018版下拉菜单项的子菜单无法选中

    软件自身问题 安装更新补丁即可解决 不想更新补丁也可以使用键盘的方向键进行选中 补丁百度云链接 https pan baidu com s 1LDxRFwQnR0GSONuz7wcEfA 提取码 6gpk
  • 面试高频的CMS回收器

    CMS回收器 低延迟 想了解更多GC垃圾回收器的知识 可以看下面这篇文章JVM之垃圾回收篇 在JDK1 5时期 Hotspot推出了一款在强交互应用中几乎可认为有划时代意义的垃圾收集器 CMS Concurrent Mark Sweep 收
  • CROSSFORMER: A VERSATILE VISION TRANSFORMER BASED ON CROSS-SCALE ATTENTION 论文阅读笔记

    CROSSFORMER A VERSATILE VISION TRANSFORMER BASED ON CROSS SCALE ATTENTION 论文阅读笔记 这是浙大 腾讯 哥伦比亚大学一起发表在ICCV的一篇文章 文章有三个贡献 一是
  • python-数据分析-numpy、pandas、matplotlib的常用方法

    一 numpy import numpy as np 1 numpy 数组 和 list 的区别 输出方式不同 里面包含的元素类型 2 构造并访问二维数组 使用 索引 切片 访问ndarray元素 切片 左闭右开 np array list
  • javascript,声明变量和导入时,大括号的特殊用法

    作为一个新手 今天看到一段奇怪的代码 定义变量时用大括号把变量名括起来了 还有import时也使用了大括号 import getToken from utils auth let data request 一脸懵 这是啥意思 度娘一番 记录
  • 【读书笔记】-《工业互联网-技术与实践》

    前言 现在的技术发展潮流 基本上往大数据 人工智能的方向发展 但是归根结底 是什么推动了这些技术产业的发展 是什么支撑的 主要说的话 这和互联网的发展息息相关 也就是说现在一些主要的发达国家是如何拓展先技术新领域 并且如何把这些新技术应用到
  • Jina 2.0 快速入门指"北"

    What Why 选择Jina的4大理由 支持所有数据类型 大规模索引和查询任何类型的非结构化数据 视频 图像 长文本 语音 源代码 PDF等 速度极快 云原生 从第一天开始 Jina就是分布式架构 具有可扩展和云原生的设计 支持容器 并行
  • shell脚本 for循环实现文件和目录遍历

    一个for循环实现一个目录下的文件和目录遍历 很实用 root localhost shell order cat test27 sh bin bash print the directory and file for file in ho
  • 浅谈数据挖掘

    一 数据挖掘起源 人们迫切希望能对海量数据进行深入分析 发现并提取隐藏在其中的信息 以更好地利用这些数据 但仅以数据库系统的录入 查询 统计等功能 无法发现数据中存在的关系和规则 无法根据现有的数据预测未来的发展趋势 更缺乏挖掘数据背后隐藏
  • 面试经典算法-回文数判断,最长回文子串

    01 回文数 Leetcode 09 回文数 判断一个整数是否是回文数 回文数是指正序 从左向右 和倒序 从右向左 读都是一样的整数 比如20200202就是一个回文数 判断回文数有三种解法 1 一般解法 将整数转为字符串 然后将字符串分割
  • 如何理解电容的阻抗-频率曲线

    B站视频讲解 https www bilibili com video BV1vz4y197kP p 3 今天我们来说一说电容的阻抗频率曲线 首先呢 为什么要讲这个呢 那是因为这个非常重要 对我们使用电容有很大的指导意义 电容阻抗 频率曲线
  • 程序员必知的23种设计模式之组合模式

    文章目录 1 模式引出 学校院系展示需求 1 1 传统方案 1 2 传统方案问题分析 2 组合模式基本介绍 2 1 方案修改 3 组合模式解决的问题 4 组合模式的注意事项和细节 1 模式引出 学校院系展示需求 编写程序展示一个学校院系结构
  • 苹果数据恢复软件:Omni Recover Mac

    Omni Recover是一款十分实用的Mac数据恢复软件 为用户提供了简单 安全 快速和高效的数据恢复服务 如果您遇到了Mac或iOS设备中的数据丢失和误删情况 不要着急 不妨尝试一下Omni Recover 相信它一定会给您带来惊喜 首
  • LeetCode题目笔记——17.19消失的两个数字

    文章目录 题目描述 题目难度 困难 方法一 暴力 代码 代码优化 方法二 数学方法 代码 总结 题目描述 题目直达 题目难度 困难 方法一 暴力 虽然题目说你能在 O N 时间内只用 O 1 的空间找到它们吗 但是也没有限制我们不能用暴力