( 数组和矩阵) 645. 错误的集合 ——【Leetcode每日一题】

news2024/10/2 12:37:26

❓645. 错误的集合

难度:简单

集合 s 包含从 1n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:

输入:nums = [1,2,2,4]
输出:[2,3]

示例 2:

输入:nums = [1,1]
输出:[1,2]

提示:

  • 2 < = n u m s . l e n g t h < = 1 0 4 2 <= nums.length <= 10^4 2<=nums.length<=104
  • 1 < = n u m s [ i ] < = 1 0 4 1 <= nums[i] <= 10^4 1<=nums[i]<=104

💡思路:

法一:交换数组元素

最直接的方法是先对数组进行排序,这种方法时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)。本题可以以 O ( n ) O(n) O(n) 的时间复杂度、 O ( 1 ) O(1) O(1) 空间复杂度来求解。

  • 主要思想是通过交换数组元素使得数组上的元素在正确的位置上
  • 这样只有 重复的数 出现在 丢失整数 的位置上。

法二:哈希表

重复的数字在数组中出现 2 次,丢失的数字在数组中出现 0次,其余的每个数字在数组中出现 1 次。因此可以使用哈希表记录每个元素在数组中是否出现

  • 如果出现两次,则找到了重复的数
  • 将所有数都存到哈希表,再遍历哈希表,则可找到丢失的数

🍁代码:(Java、C++)

法一:交换数组元素
Java

class Solution {
    public int[] findErrorNums(int[] nums) {
        for(int i = 0; i < nums.length; i++){
            while(nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]){
                swap(nums, i, nums[i] - 1);
            }
        }
        for(int i = 1; i <= nums.length; i++){
            if(nums[i - 1] != i){
                return new int[]{nums[i - 1], i};
            }
        }
        return null;
    }
    private void swap(int[] nums, int i, int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

C++

class Solution {
public:
    vector<int> findErrorNums(vector<int>& nums) {
        for(int i = 0; i < nums.size(); i++){
            while(nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]){
                swap(nums, i, nums[i] - 1);
            }
        }
        for(int i = 1; i <= nums.size(); i++){
            if(nums[i - 1] != i){
                return {nums[i - 1], i};
            }
        }
        return {};
    }
    void swap(vector<int>& nums, int i, int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
};

法二:哈希表
Java

class Solution {
    public int[] findErrorNums(int[] nums) {
        HashSet<Integer> s = new HashSet<>();
        int repeat = 0, lose = 0;
        for(int num : nums){
            if(s.contains(num)) repeat = num;
            s.add(num);
        }
        for(int i = 1; i <= nums.length; i++){
            if(!s.contains(i)){
                lose = i;
                break;
            }
        }
        return new int[]{repeat, lose};
    }
}

C++

class Solution {
public:
    vector<int> findErrorNums(vector<int>& nums) {
        unordered_set<int> s;
        int repeat = 0, lose = 0;
        for(int num : nums){
            if(s.find(num) != s.end()) repeat = num;
            s.insert(num);
        }
        for(int i = 1; i <= nums.size(); i++){
            if(s.find(i) == s.end()){
                lose = i;
                break;
            }
        }
        return {repeat, lose};
    }
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 为数组的长度。
  • 空间复杂度 O ( 1 ) O(1) O(1),法一只需常量级空间;而哈希表需要创建大小为 O ( n ) O(n) O(n) 的哈希表,空间复杂度为 O ( n ) O(n) O(n)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/484673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教你如何快速安装下载EasyRecovery16最新版本

最近辛辛苦苦写的PPT报告被手残的我一个不小心给删除了&#xff0c;本来在空调屋里懂得瑟瑟发抖的我瞬间后背就被汗水浸湿了&#xff0c;好在懂点计算机知识&#xff0c;没有继续乱操作&#xff0c;在使用EasyRecovery后很快就找回来了! EasyRecovery 16&#xff08;有几个版本…

Git(六):基本命令(3):储藏、标签、拉取、子模块

目录 17、stash 储藏 17.2 描述 17.3 基本用法 18、tag 标签 18.1 描述 18.2 基本用法 19、fetch 获取 19.1 描述 19.2 基本用法 20、pull 整合 20.1 描述 20.2 基本用法 20.3 pull 与 fetch 的区别 21、push 更新推送 21.1 描述 21.2 基本用法 22、remote 管…

Vue性能优化

目录 Vue性能优化的必要性&#xff1a;Vue项目优化工具webpack-bundle-analyzerwebpack-bundle-analyzer作用&#xff1a;webpack-bundle-analyzer用法&#xff1a;webpack-bundle-analyzer运行&#xff1a;webpack-bundle-analyzer使用&#xff1a; vue项目性能优化代码模块化…

Tensorflow入门图像分类-猫狗分类-安卓

最近在温习 Tensorflow&#xff0c;写了一篇笔记&#xff0c;记录了使用 Tensorflow 训练一个猫狗图像分类器的模型并在安卓应用上使用的全过程。 一、数据集准备 1.1 数据集来源 我采用的是微软的猫狗数据集&#xff0c;链接&#xff1a;Download Kaggle Cats and Dogs Datas…

2023华中杯数学建模C题完整模型代码

已完成全部模型代码&#xff0c;文末获取。 摘要 随着工业化和城市化的快速发展&#xff0c;空气污染已经成为全球性的环境问题。细颗粒物&#xff08;PM2.5&#xff09;等污染物对人类健康、生态环境和社会经济造成了严重影响。本研究旨在深入探究影响PM2.5浓度的主要因素&a…

【Android入门到项目实战-- 8.4】—— 如何解析JSON格式数据

目录 一、准备工作 二、使用JSONObject 三、使用GSON 比起XML&#xff0c;JSON的主要优势在于它的体积更小&#xff0c;在网络上传输的时候可以更省流量&#xff0c;但缺点是语义性较差&#xff0c;看起来不直观。 一、准备工作 还是使用前面文章的方法&#xff0c;在服务器…

【C++】STL标准库之vector

STL标准库之vector vector类的简介常用的vector类的接口构造容量遍历及访问增删查改迭代器迭代器失效问题 vector类的简介 vector是大小可变数组的序列容器&#xff0c;与string相比&#xff0c;vector中可以存任何类型的数据&#xff0c;而string中存储的只能是字符类型。 因为…

第二十九章 使用消息订阅发布实现组件通信

PubSubJS库介绍 如果你想在React中使用第三方库来实现Pub/Sub机制&#xff0c;PubSubJS是一个不错的选择。它是一个轻量级的库&#xff0c;可以在浏览器和Node.js环境中使用。 PubSubJS提供了一个简单的API&#xff0c;可以让你在应用程序中订阅和发布消息。你可以使用npm来安…

大数据Doris(十):Doris基础介绍

文章目录 Doris基础介绍 一、基本概念 二、建表语法及参数解释 1、column_definition_list 2、index_definition_list 3、engine_type 4、key_type 5、table_comment 6、partition_desc 7、distribution_desc 8、rollup_list 9、properites 三、数据类型 Doris基础…

java合并数组的方法

在 Java中&#xff0c;数组是一种重要的数据结构&#xff0c;在 Java中数组的操作方式有两种&#xff0c;一种是直接使用数组来操作&#xff0c;另一种是通过引用计数或者双指针对数组进行操作。对于直接使用数组来操作的方式&#xff0c;我们可以通过两个方法来实现。 一种是将…

C++(多态中)

目录&#xff1a; 1.多态实现原理&#xff08;再剖析&#xff09; 2.析构函数加virtual 3.C11新增两个关键字 override 和 final 4.重载、覆盖&#xff08;重写&#xff09;、隐藏的对比 5.抽象类 1.多态实现原理&#xff08;再剖析&#xff09; 实现出多态的效果&#xff0c;我…

Docker之Docker Compose技术

目录 一、什么是docker compose? 二、安装docker compose 三、使用案例&#xff1a;部署一个简单的fastapi服务 (以下教程是基于环境已将安装了docker服务) 一、什么是docker compose? Compose是一个将多个docker容器组合部署的技术&#xff0c;能通过编写yaml配置文件…

IJCAI2023 | A Systematic Survey of Chemical Pre-trained Models(化学小分子预训练模型综述)

IJCAI_A Systematic Survey of Chemical Pre-trained Models 综述资料汇总(更新中&#xff0c;原文提供)&#xff1a;GitHub - junxia97/awesome-pretrain-on-molecules: [IJCAI 2023 survey track]A curated list of resources for chemical pre-trained models 参考资料&…

『python爬虫』09. bs4实战之下载精美壁纸(保姆级图文)

目录 爬取思路代码思路1.拿到主页面的源代码. 然后提取到子页面的链接地址, href2.通过href拿到子页面的内容. 从子页面中找到图片的下载地址 img -> src3.下载图片 3. 完整实现代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&…

docker 非持久化存储 tmpfs mounts

docker 非持久化存储 tmpfs mounts 简介tmpfs mounts 限制--tmpfs 和 --mount 之间的差异在容器中使用 tmpfs mounts指定 tmpfs 选项 简介 官方文档&#xff1a;https://docs.docker.com/storage/tmpfs/ 与 volume 和 bind mounts 不同&#xff0c;tmpfs mounts 是临时的&…

jdk中juc多线程编程工具

jdk线程池实现原理分析 目录 CompletionService CompletableFuture 基本原理 CompletableFuture的接口 静态方法 handle() vs whenComplete() xxxEither() 异常处理exceptionally() 获取任务结果 结束任务 Semaphore CyclicBarrier CountDownLatch jdk线程池实…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 4 Mining Data Streams

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 4 Mining Data Streams &#x1f4a1; Skip this chapter due to its difficulty and for me, it is hard to understand. Summary of Chapter 4 The Stream Data Model: This model assumes da…

【微机原理】半导体存储器

目录 一.半导体存储器的分类 二、半导体存储器性能指标 三、半导体存储器的结构 一.半导体存储器的分类 半导体存储器的分类方法有很多种。 1.按器件原理来分&#xff1a;有双极型存储器和MOS型存储器。 双极型&#xff1a;速度快、集成度低、功耗大MOS型&#xff1a;速度慢、集…

“ 探索迷局:解密广度寻路算法 “

专栏文章&#xff0c;自下而上 数据结构与算法——二叉搜索树 数据结构与算法——深度寻路算法 数据结构与算法——二叉树实现表达式树 数据结构与算法——树(三指针描述一棵树&#xff09; 数据结构与算法——栈和队列&#xff1c;也不过如此&#xff1e; 数据结构与算法——八…

C++的智能指针

文章目录 1. 内存泄漏1.1 什么是内存泄漏1.2 内存泄漏分类 2. 为什么需要智能指针3. 智能指针的使用及原理3.1 RAII3.2 使用RAII思想设计的SmartPtr类3.3 让SmartPtr像指针一样3.3 SmartPtr的拷贝3.4 auto_ptr3.5 unique_ptr3.6 shared_ptr3.6.1 shared_ptr的循环引用3.6.2 wea…