ShuangChenYue ShuangChenYue
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
首页
  • Cpp之旅
  • Cpp专栏
  • Effective_CPP
  • muduo网络库
  • Unix环境高级编程
  • Cpp提高编程
  • 计算机网络
  • 操作系统
  • 数据结构
  • Linux
  • 算法
  • 基础篇
  • MySql
  • Redis
  • 电子嵌入式通信协议
  • 深入浅出SSD
  • 文件系统
  • 汇编语言
  • STM32
  • 随笔(持续更新)
  • Git知识总结
  • Git 创建删除远程分支
  • nvm使用小结
  • 虚拟机固定 IP 地址
  • Shell 脚本学习笔记
  • VScode 插件 CodeGeeX 使用教程
  • KylinV10 将项目上传至 Github教程
  • KylinV10 安装 MySQL 教程(可防踩雷)
  • kylinV10-SP1 安装 QT
  • 高并发内存池
  • USBGUARD 项目编译环境配置
  • Power_Destory 项目
  • U 盘清除工具编译教程
  • 个人博客代码推送教程
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • MFC编程随记
  • MFC实现ini配置文件的读取
  • MFC实现点击列表头排序
  • 贴图法美化Button按钮
  • 如何高效阅读嵌入式项目代码
  • NAND Flash
  • ARM 处理器
  • 嵌入式基础知识-存储器
  • 闪存存储和制造技术概述
  • 芯片IO驱动力
  • 主流先进封装技术介绍
  • 虎牙C++技术面经
  • 金山一面复习
  • 完美世界秋招 C++ 游戏开发面经(Cpp部分)
  • 博客搭建
  • 网站收藏箱
  • 网络

  • 操作系统

  • 数据结构

  • 算法

    • 两数之和
    • 回文数
    • 最长公共前缀
    • 三数之和
    • 删除有序数组中的重复项
    • 最大子数组和
    • x 的平方根
    • 爬楼梯
    • 对称二叉树
    • 二叉树的最大深度
    • LCR寻找文件副本
      • 题目:
      • 示例:
      • 解题:
        • 方法一:哈希表
    • 买卖股票的最佳时机
    • LCR图书整理 II
    • 只出现一次的数字
    • LCR 训练计划 II
    • 环形链表
    • LRU 缓存
    • 反转字符串中的单词
    • LCR 破冰游戏
    • 反转链表
    • 翻转二叉树
    • 回文链表
    • 移动零
    • 最长回文串
    • 汉明距离
    • 把二叉搜索树转换为累加树
    • 最短无序连续子数组
    • 合并二叉树
    • 二分查找
    • 链表的中间结点
    • 有序数组的平方
    • 找到小镇的法官
  • Linux

  • 计算机基础
  • 算法
霜晨月
2023-12-15
目录

LCR寻找文件副本

# LCR 120. 寻找文件副本 (opens new window)

# 题目:

设备中存有 n 个文件,文件 id 记于数组 documents。若文件 id 相同,则定义为该文件存在副本。请返回 任一存在 副本的文件 id。

# 示例:

示例 1:

输入:documents = [2, 5, 3, 0, 5, 0]
输出:0 或 5
1
2

提示:

  • 0 ≤ documents[i] ≤ n-1
  • 2 <= n <= 100000

# 解题:

# 方法一:哈希表

利用数据结构特点,容易想到使用哈希表(Map)记录数组的各个数字,当查找到重复数字则直接返回。

==注意:题目是返回任一,也就是返回其中一个就行==

算法流程:

  1. 初始化: 新建 HashMap ,记为 hmap ;
  2. 遍历数组 documents 中的每个数字 doc :
    • 当 doc 在 hmap 中,说明重复,直接返回 doc;
    • 将 doc 添加至 hmap 中;
  3. 返回 −1。本题中一定有重复数字,因此这里返回多少都可以。
class Solution {
public:
    int findRepeatDocument(vector<int>& documents) {
        unordered_map<int, bool> hmap;
        for(int doc: documents) {
          if(hmap[doc]) return doc;
          hmap[doc] = true;
        }
        return -1;
    }
};
1
2
3
4
5
6
7
8
9
10
11

复杂度分析:

  • 时间复杂度 O(N) : 遍历数组使用 O(N) ,HashMap 添加与查找元素皆为 O(1) 。
  • 空间复杂度 O(N) : HashMap 占用 O(N) 大小的额外空间。

可调试的代码:

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

class Solution {
public:
    int findRepeatDocument(vector<int>& documents) {
        unordered_map<int, bool> hmap;
        for (int doc : documents) {
            if (hmap[doc]) return doc;
            hmap[doc] = true;
        }
        return -1;
    }
};

int main() {
    // 示例用法
    vector<int> documents = { 1, 2, 3, 1, 5, 2 }; // 包含文件 ID 1、2 的副本
    Solution solution;
    int duplicateID = solution.findRepeatDocument(documents);

    if (duplicateID != -1) {
        cout << "存在副本的文件 ID 是: " << duplicateID << endl;
    }
    else {
        cout << "未找到存在副本的文件 ID" << endl;
    }

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
上次更新: 2024/6/3 14:54:44
二叉树的最大深度
买卖股票的最佳时机

← 二叉树的最大深度 买卖股票的最佳时机→

Theme by Vdoing | Copyright © 2023-2024 霜晨月
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式