代码随想录-哈希表

news2024/10/7 20:31:02

学习《代码随想录》

  • 基础知识
    • 哈希函数
    • 哈希碰撞
    • 三种哈希结构
  • 有效的字母异位词
  • 两个数组的交集
  • 两数之和
    • 暴力法
    • Map
  • 四数相加
  • 三数之和
    • 哈希解法
    • 双指针法
  • 四数之和

基础知识

哈希表是一种根据关键码的值直接访问数据的数据结构。一般用来快速判断一个元素是否出现在集合中。

哈希函数

hashCode通过特定编码格式,可以将其他数据格式转化为不同的数值。然后哈希函数把这些值映射在哈希表的索引上。

哈希碰撞

遇到哈希碰撞后,有两种解决方法:

拉链法:将冲突的值依次存储在链表中。

线性探测法:将冲突的值存储在下一个空位,因此必须保证 tableSize 大于 dataSize 。

三种哈希结构

分别是:数组、集合(set)、映射(map)

当我们使用集合解决哈希问题的时候,优先使用 unordered_set ,因为它的查询和增删效率最优;

若要求集合有序,就使用 set

若要求集合不仅有序,还要有重复数据,就使用 multiset

前者的底层实现用哈希表,后两者用红黑树

有效的字母异位词

在这里插入图片描述

class Solution {
public:
    bool isAnagram(string s, string t) {
		int record[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            record[s[i] - 'a']++;
        }
        for (int i = 0; i < t.size(); i++) {
            record[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (record[i] != 0) {
                return false;
            }
        }
        return true;
    }
};

两个数组的交集

在这里插入图片描述

unordered_set

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
		unordered_set<int> result_set; // 保存结果
        unordered_set<int> nums_set(nums1.begin(), nums1.end()); // 去重
        for (int num : nums2) {
            // find()查找该元素第一次出现的位置,end()指向末尾元素的下一个位置
            if (nums_set.find(num) != nums_set.end()) { // 说明找到了
                result_set.insert(num); // 放入交集
            }
        }
        return vector<int>(result_set.begin(), result_set.end()); // 这里用vector
    }
};

两数之和

在这里插入图片描述

暴力法

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        for (int i = 0; i < nums.size(); i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                if (nums[i] + nums[j] == target) {
                    return {i, j};
                }
            }
        }
        return {};
    }
};

时间复杂度:O(n^2)

Map

在本题中,用数组不好,因为元素很少;也不适用 set ,因为 set 只保存一个 key ,但我们既要比较值,同时保存下标。

故选用 map ,<key, value> 用 key 表示值,用 value 记录下标。

class Solution {
public:
   vector<int> twoSum(vector<int>& nums, int target) {
       unordered_map<int, int> map;
       for (int i = 0; i < nums.size(); i++) {
           auto iter = map.find(target - nums[i]); // auto 自己推演数据类型
           if (iter != map.end()) {  // 找到一个
           	return {i, iter->second}; // first表示key,second表示value
           }
           map.insert(pair<int, int>(nums[i], i)); // map<X,Y>实际存储的是pair<const X,Y>
       }
       return {};
   }
};

时间复杂度:O(n)

四数相加

在这里插入图片描述

原式可转化为 nums1[i] + nums2[j] = -nums3[k] - nums4[l]

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
		unordered_map <int, int> umap;
        for (int a : nums1) {
            for (int b : nums2) {
                umap[a + b]++;
            }
        }
        // 找0 - (c + d)
        int count = 0;
        for (int c : nums3) {
            for (int d : nums4) {
                if (umap.find(0 - (c + d)) != umap.end()) {
                    count += umap[0 - (c + d)];
                }
            }
        }
        return count;
    }
};

三数之和

在这里插入图片描述

哈希解法

输出结果与预期结果不符,不能吧。挨个对了一遍,没错啊

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
		vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > 0) break;
            if (i > 0 && nums[i - 1] == nums[i]) { // 元素a去重
                continue;
            }
            unordered_set<int> set;
            for (int j = i + 1; j < nums.size(); j++) {
                if (j > i + 2 && nums[j - 2] == nums[j - 1] && nums[j - 1] == nums[j]) { // 元素b去重
                    continue;
                }
                int c = 0 - (nums[i] + nums[j]);
                if (set.find(c) != set.end()) {
                    result.push_back({nums[i], nums[j], c});
                    set.erase(c); // 元素c去重
                } else {
                    set.insert(nums[j]) // 不懂
                }
            }
        }
        return result;
    }
};

双指针法

学不懂了,先放着

四数之和

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

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

相关文章

【AUTOSAR】Com通讯栈配置说明(二)---- CanIf模块

CanIf模块 CanIfCtrlDrvCfgs CanIfCtrlDrvBusOffNotification:busoff 发生后的callback函数 CanIfCtrlDrvWakeupNotification: wakeup 发生后的callback函数 CanIfCtrlId: 逻辑Canif id CanIfWakeupSupport:是否支持唤醒 CanIfMaxDlc:最大报文长度 CanIfCtrlCanCtrlRef: 关联…

我们是如何管理蓝精灵协会 PFP 集合的程序性生成的?

自从 Cryptopunks 和 Bored Apes 发布以来&#xff0c;大多数蓝筹 NFT 系列都在其创意基准中使用了相同的反复出现的概念&#xff1a;一幅插图肖像&#xff08;也称为 PFP&#xff0c;用于个人资料图片或证明图片&#xff09;通过使用随机分布的定制层而被改变成几千种略有不同…

【回顾经典AI神作】理解和实现ResNeXt(比ResNet最先进的图像分类模型)

与 ResNet 相比好在哪里? 相同的参数个数,结果更好:一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度差不多,但是计算量只有后者的一半 论文参考:https://arxiv.org/pdf/1611.05431.pdf 以下三篇是介绍和改进残差网络的论文: 用于图像识别的深度残差学习(链接…

ELECTRA模型简单介绍

目录 一、整体概要 二、生成器 三、判别器 四、模型训练 五、其它改进 一、整体概要 ELECTRA&#xff08;Efficiently Learning an Encoder that Classifies Token Replacements Accurately&#xff09;采用了一种“生成器——判别器”结构&#xff0c;其与生成式对抗网络…

报表服务器Stimulsoft Server v2023.2亮点:支持PostgreSQL、选项卡

Stimulsoft Server&#xff08;原Stimulsoft Reports.Server&#xff09;是一款完善的商业智能解决方案&#xff0c;采用C/S架构&#xff0c;提供报告和分析功能。前端用来展现数据&#xff0c;后台用来处理和存储数据。Stimulsoft Server&#xff08;原Stimulsoft Reports.Ser…

IDEA性能优化设置(解决卡顿问题)

在我们日常使用IDEA进行开发时&#xff0c;可能会遇到许多卡顿的瞬间&#xff0c;明明我们的机器配置也不低啊&#xff1f;为什么就会一直卡顿呢&#xff1f; 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限&#xff08;通常很小&#xff09;&#xff0c;这就…

成都远石无人机航测服务的具体内容

成都远石拥有多年西南地区无人机航测作业经验&#xff0c;现具备DEM、DSM、DOM、三维实景模型及机载激光雷达全套数据成果的生产能力&#xff0c;致力于为各个行业提供准确的数据支持。现在&#xff0c;小编就来给大家介绍成都远石无人机航测服务的具体内容。 1、数字高程模型…

SocketTools Library Edition C++ Crack

SocketTools 库版 SocketTools Library Edition 是一套 Windows 库&#xff0c;可简化 Internet 应用程序开发。它提供您入门所需的一切&#xff0c;包括文档和示例&#xff0c;以及免费的技术支持来回答您遇到的任何开发问题。SocketTools Library Edition 包括本机 Windows 库…

Java集成influxDB 默认UTC时区问题

dd 我用的influxDB 1.8版本高版本我不清楚&#xff0c;因为1.x版本便于写sq语法。 influxDB时序库默认使用 UTC时区&#xff0c;并且无法通过配置来修改这个时区&#xff0c;很多文档说在查询数据的时候加上 tz(Asia/Shanghai)。 而这个在Windows环境下的influxdb会报错…

【youcans动手学模型】AlexNet模型CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】AlexNet模型CIFAR10图像分类 1. AlexNet 卷积神经网络模型1.1 论文简介1.2 AlexNet 的主要贡献1.3 AlexNet 网络1.4 模型的运行结果 2. 在 PyTorch 中定义 AlexNet 模型类2.1 按…

Qt编写视频监控系统77-Onvif组件支持非正常时间的设备

一、前言 在经历了大量的现场设备测试&#xff0c;至少几十种厂家、几百种设备&#xff0c;遇见过奇奇怪怪的问题&#xff0c;一个个想方设法解决&#xff0c;发现有个问题是在下发鉴权的时候&#xff0c;需要带上设备的时间&#xff0c;而不是发送端的时间&#xff0c;如果带…

LeetCode 1110. 删点成林

【LetMeFly】1110.删点成林 力扣题目链接&#xff1a;https://leetcode.cn/problems/delete-nodes-and-return-forest/ 给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c…

MySQL 系统信息函数

文章目录 系统信息函数1. 查看当前 MySQL 数据库版本号2. 查看当前使用的数据库3. 查看当前服务器连接次数 系统信息函数 当我们需要知道当前 MySQL 数据库的一些基本信息和使用情况的时候&#xff0c;可以使用系统信息函数来获取相关信息&#xff0c;以随时掌握数据库的使用情…

【C++系列P2】引用——背刺指针的神秘刺客(精讲一篇过!)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01;如标题所示&#xff0c;本章主要内容主要来侃侃“引用”这个刺客&#xff01;如下就是大纲啦~ 一.引用 1.含义与特点 引用&#xff0c;即取别名。它的最大特点是编译器不会为引用变量而开辟空间…

Segment Anything——图像分割的基础模型介绍

人工智能中的基础模型变得越来越重要。这个术语开始在 NLP 领域加快步伐,现在,随着 Segment Anything Model 的出现,他们也慢慢进入了计算机视觉领域。Segment Anything是 Meta 的一个项目,旨在为图像分割的基础模型构建起点。在本文中,我们将了解 Segment Anything 项目最…

Python:Python编程:从入门到实践__超清版:线程

Python线程与安全 实现线程安全有多重方式&#xff0c;常见的包括&#xff1a;锁&#xff0c;条件变量&#xff0c;原子操作&#xff0c;线程本地存储等。 &#x1f49a; 1. 锁2. 条件变量3. 通过 join 阻塞当前线程4. 采用 sleep 来休眠一段时间5. 原子操作5.1 使用 threading…

HTTP请求中token、cookie、session有什么区别

cookie HTTP无状态的&#xff0c;每次请求都要携带cookie,以帮助识别身份服务端也可以向客户端set-cookie,cookie大小4kb默认有跨域限制&#xff1a;不可跨域共享&#xff0c;不可跨域传递cookie&#xff08;可通过设置withCredential跨域传递cookie&#xff09; cookie本地存…

【EXata】5.4 连接到互联网

目录 5.4 连接到互联网 5.4.1 Windows 互联网网关配置 5.4.3 验证互联网网关配置 5.4 连接到互联网 EXata 允许在操作主机上运行的基于 Internet 的应用程序通过模拟网络连接到 Internet。这使得即时通讯、流媒体视频、VoIP 等应用程序可以像在现实世界中一样在 EXata 上运行。…

理解Java关键字volatile

原文链接 理解Java关键字volatile 在Java中&#xff0c;关键字volatile是除同步锁以外&#xff0c;另一个同步机制&#xff0c;它使用起来比锁要简单方便&#xff0c;但是却很容易被忽略&#xff0c;或者被误用。这篇文章就来详细讲解一下volatile它的作用&#xff0c;它的原理…

【图像水印 2022 ACM】PIMoG

【图像水印 2022 ACM】PIMoG 论文题目&#xff1a;PIMoG: An Effective Screen-shooting Noise-Layer Simulation for Deep-Learning-Based Watermarking Network 中文题目&#xff1a;PIMoG:深度学习水印网络中一种有效的截屏噪声层仿真 论文链接&#xff1a;https://dl.acm.o…