leetcode-哈希表
1. 理论
从哈希表的概念、哈希碰撞、哈希表的三种实现方式进行学习

哈希表:用来快速判断一个元素是否出现集合里。也就是查值就能快速判断,O(1)复杂度;
哈希碰撞:拉链法,线性探测法等。只是一种思想,刷题我们自己是无需实现的,只是使用;
哈希表的三种实现方式:数组,set(集合),map(映射)。其中集合和映射分别又有三种实现。
2. 做题的时候用到的小tip:
- set和vector不能直接相互转换,但可以通过遍历一个容器并将其元素插入另一个容器实现数据转换。
以下是将 std::set 转换为 std::vector 和将 std::vector 转换为 std::set 的示例:
将 std::set 转换为 std::vector:std::vector<int> myVector(mySet.begin(), mySet.end());
将 std::vector 转换为 std::set:std::set<int> mySet(myVector.begin(), myVector.end());
如果不是定义,直接return的时候,就用return set<int>(myVector.begin(), myVector.end()); 就行。
3. 有效的字母异位词
本题用数组就能完成,但是用到的是哈希思想。
class Solution {
public:bool isAnagram(string s, string t) {if(s.length()!=t.length())return false;int hash[26] = {0};for(char i : s){hash[i-'a']++;}for(char i : t){hash[i-'a']--;}for(int i : hash){if(i != 0) return false; }return true;}
}; 4. 两个数组的交集Leetcode349. 20230904 set操作、转换、哈希思想
如果使用unordered_set(底层为哈希表),代码如下:
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int>result_nums;// 最终返回的交集unordered_set<int>tmp_nums(nums1.begin(), nums1.end());// 用于比较的集合 for(int i : nums2){if(tmp_nums.find(i) != tmp_nums.end()){result_nums.insert(i);}}return vector<int>(result_nums.begin(),result_nums.end()); }
}; 写这一题的时候由于不熟悉set和vector之间的相互转换,卡了好久。思路倒是不难,但是要声明两个unordered_set。先是用第一个uset存nums1的所有值,然后比较nums2是否在uset里,如果在,就加入到第二个uset中去。
所以为什么要用一个uset存,而不是直接用nums2与vector的nums1比呢?这就是本题的哈希所在,因为对于unordered_set查找只需O(1时间,如果直接将nums2与nums1的vector比较,那么每次查找操作的平均时间复杂度将是O(n),因为在vector中查找元素需要遍历整个vector,而不是像unordered_set一样具有O(1)的查找时间。这会导致整个算法的时间复杂度更高。
这种做法的主要优势在于查找的时间复杂度更低,使得整个算法的性能更好。
如果使用数组,也是类似的:
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result;int tmp[1000]={0};for (int i : nums1){tmp[i] = 1;}for (int j : nums2){if(tmp[j] == 1)result.insert(j);}return vector<int>(result.begin(),result.end());}
}; 先用tmp 01数组存nums1中出现过的值,然后遍历nums2看tmp数组对应有没有变过,变过则插入uset。
然后我又做了一个不去重的交集题,麻烦的是有个限制条件让我们次数不一致取最小值,就要使用find之后erase iterator而不能直接用erase。这个也是我上网查了之后才知道的。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
// 不去重,考虑使用multiset
multiset<int> result;
multiset<int> tmp(nums1.begin(),nums1.end());
for(int i : nums2){
auto it = tmp.find(i);
if(it != tmp.end()){
result.insert(i);
tmp.erase(it);
}
}
return vector<int>(result.begin(),result.end());
}
};
这个我没检查就提交一次过了,晕晕
5. 快乐数 LeetCode. 202 20230905
这一题居然不是数学是哈希 还真是没想到。并且,这一题对于各位数取平方再相加的操作是我要学习的,当时写的时候觉得很头大,没想到包装成一个函数之后还是很容易的。
class Solution {
public:int calculatesum(int n){int sum = 0;while (n){sum += (n % 10) * (n % 10);n /= 10;}return sum;}bool isHappy(int n) {// 计算平方,填入哈希表并比较unordered_set<int> myset;int sum = n;while(sum != 1){sum = calculatesum(sum);if(myset.find(sum) != myset.end()){return false;} else{myset.insert(sum);} }return true;}
}; 6.两数之和 LeetCode 1. 20230905
老生常谈的题,但是每次做都有不一样的感受。前年只会暴力解,去年仅知道可以用unordered_map,今年的进步在于读懂了题目为什么这样出,限制不重复就是为了我们用unorder_map,限制时间复杂度其实就是提示unordered的查询和插入效率均为O(1)。
还有一个就是
iter->second ,不带括号 和return {a,b}; 这个用法不能忘掉。开始写的小括号,又换成中括号。
还有pair操作,是insert((pair)<int,int>(a,b))
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> mymap;int size = nums.size();for(int i = 0; i < size; ++i){auto it = mymap.find(target - nums[i]);if( it != mymap.end()){return {i, it->second};}else{mymap.insert(pair<int,int>(nums[i],i));}}return {-1,-1};}
}; 思想是遍历vector,用unordered_map存放之前遍历过的元素集合和它们对应的序号,每遍历到一个元素,在遍历过的集合里找是否有target减它的元素。
7.四数相加 II LeetCode 454. 20230908
思想是两个数组一起。前两个数组用于填充,后两个数组用于查询,跟之前一样。
需要注意的是可以可以直接使用umap[i]++这种操作。
class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> umap;int count = 0;for(int i : nums1){for(int j : nums2){umap[i+j]++;}}for(int i : nums3){for(int j : nums4){auto it = umap.find(-i-j);if(it != umap.end()){count += it->second;}}}return count;}
}; 如果本题想难度升级:就是给出一个数组(而不是四个数组),在这里找出四个元素相加等于0,答案中不可以包含重复的四元组。
8.赎金信 LeetCode383. 20230908
class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int character[26]={0};for(char i : magazine){character[i-'a']++;}for(char i : ransomNote){character[i-'a']--;if(character[i-'a'] < 0)return 0;}return 1;}
}; 现在看到简单题基本就是嘎嘎乱杀了,这一题完全无难度,三分钟秒掉。
有一点需要注意:数组需要初始化……TAT
9. 三数之和
这一题的数据就是一个数组,我还以为跟之前一样,是三个数组。
这一题不建议用哈希法,因为是“去重”的,建议的方法是排序+双指针+去重。
去重是三个地方,我写的代码还跟随想录不一样,先以自己的为主。
遇到了一个坑:i++和continue,应该写continue,因为-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6
这个里面,i如果到了第二个-2,会直接+1,然后到了第三个-2又能够顺利往下运行,然后又会找到和第二个-2相同的三元组。想了好久的。
正确的做法应该是第二个-2:跳过!
第三个-2:跳过!
这样就能到0。
贴一个我自己写出来的代码:
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)return result;if(i > 0 && nums[i] == nums[i - 1]){continue;}for(int left = i + 1, right = nums.size() - 1; left < right; ){if(nums[left] + nums[right] + nums[i] > 0){right--; }else if(nums[left] + nums[right] + nums[i] < 0){left++;}else {result.push_back({nums[i], nums[left], nums[right]}); //找到了一个答案left++;right--;while(left < right && nums[left] == nums[left - 1]) left++;//去重while(left < right && nums[right] == nums[right + 1]) right--;//去重}}}return result;}
}; 10.四数之和

第一次提交通过了239/293个用例。但是,就这一行写了两个bug
①一开始写的不是j>1,复制了i>0过来,写的是if(i>0&&nums[j]==nums[j-1]),通过239/293


②后来写成图上的if(j>1&&nums[j]==nums[j-1])完全没考虑i==j的情况,于是改成if(j>i+1&&nums[j]==nums[j-1]),结果通过284/293……服了,然后改成longlong,结果因为中间结果是用int存的,还是不行

③然后把代码改成了这个丑陋的样子,终于过了,用时一个小时,啥也不想说了
相关文章:
leetcode-哈希表
1. 理论 从哈希表的概念、哈希碰撞、哈希表的三种实现方式进行学习 哈希表:用来快速判断一个元素是否出现集合里。也就是查值就能快速判断,O(1)复杂度; 哈希碰撞:拉链法,线性探测法等。只是一种…...
NOIP2023模拟6联测27 旅行
题目大意 有一个有 n n n个点 n n n条边的无向连通图,一开始每条边都有一个颜色 c c c。 有 m m m次操作,每次操作将一条两个端点为 x , y x,y x,y的边的颜色修改为 c c c。求每次修改之后,图中有多少个颜色相同的连通块。 一个颜色相同的…...
【表面缺陷检测】钢轨表面缺陷检测数据集介绍(2类,含xml标签文件)
一、介绍 钢轨表面缺陷检测是指通过使用各种技术手段和设备,对钢轨表面进行检查和测量,以确定是否存在裂纹、掉块、剥离、锈蚀等缺陷的过程。这些缺陷可能会对铁路运输的安全和稳定性产生影响,因此及时进行检测和修复非常重要。钢轨表面缺陷…...
SHCTF 2023 新生赛 Web 题解
Web [WEEK1]babyRCE 源码过滤了cat 空格 我们使用${IFS}替换空格 和转义获得flag [WEEK1]飞机大战 源码js发现unicode编码 \u005a\u006d\u0078\u0068\u005a\u0033\u0074\u006a\u0059\u006a\u0045\u007a\u004d\u007a\u0067\u0030\u005a\u0069\u0030\u0031\u0059\u006d\u0045…...
二叉树题目合集(C++)
二叉树题目合集 1.二叉树创建字符串(简单)2.二叉树的分层遍历(中等)3.二叉树的最近公共祖先(中等)4.二叉树搜索树转换成排序双向链表(中等)5.根据树的前序遍历与中序遍历构造二叉树&…...
dbeaver配置es连接org.elasticsearch.xpack.sql.jdbc.EsDriver
查看目标es服务版本,下载对应驱动...
有监督学习线性回归
1、目标分析(回归问题还是分类问题?) 2、获取、处理数据 3、创建线性回归模型 4、训练模型 5、模型测试 x_data [[6000, 58], [9000, 77], [11000, 89], [15000, 54]] # 样本特征数据 y_data [30000, 55010, 73542, 63201] # 样本目标数…...
如何在vscode中添加less插件
Less (Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言。它对CSS 语言增加了少许方便的扩展,通过less可以编写更少的代码实现更强大的样式。但less不是css,浏览器不能直接识别,即浏览器无法执行less代码&a…...
mediapipe 训练自有图像数据分类
参考: https://developers.google.com/mediapipe/solutions/customization/image_classifier https://colab.research.google.com/github/googlesamples/mediapipe/blob/main/examples/customization/image_classifier.ipynb#scrollToplvO-YmcQn5g 安装:…...
【pytorch】torch.gather()函数
dim0时 index[ [x1,x2,x2],[y1,y2,y2],[z1,z2,z3] ]如果dim0 填入方式为: index[ [(x1,0),(x2,1),(x3,2)][(y1,0),(y2,1),(y3,2)][(z1,0),(z2,1),(z3,2)] ]input [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12] ] # shape(3,4) input torch.…...
Mac 安装psycopg2,报错Error: pg_config executable not found.
在mac 上安装psycopg2的方法:执行:pip3 install psycopg2-binary。 如果执行pip3 install psycopg2,无法安装psycopg2 报错信息如下: Collecting psycopg2Using cached psycopg2-2.9.9.tar.gz (384 kB)Preparing metadata (set…...
域名系统 DNS
DNS 概述 域名系统 DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为 IP 地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了许多的“域(domain)”&#x…...
Vue $nextTick 模板解析后在执行的函数
this.$nextTick(()>{ 模板解析后在执行的函数 })...
VBA技术资料MF76:将自定义颜色添加到调色板
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...
zilong-20231030
1)k个反转 2)n!转12进制 求末尾多少0 一共有几位 (考虑了溢出问题) 3)大量数据获取前10个 4)reemap地城结构 5)红黑树规则特性 6)热更 7)压测 8)业务 跨服实现 9)有哪些线程以及怎么分配...
目标检测算法发展史
前言 比起图像识别,现在图片生成技术要更加具有吸引力,但是要步入AIGC技术领域,首先不推荐一上来就接触那些已经成熟闭源的包装好了再提供给你的接口网站,会使用别人的模型生成一些图片就能叫自己会AIGC了吗?那样真正…...
React 生成传递给无障碍属性的唯一 ID
useId() 在组件的顶层调用 useId 生成唯一 ID: import { useId } from react; function PasswordField() { const passwordHintId useId(); // ...参数 useId 不带任何参数。 返回值 useId 返回一个唯一的字符串 ID,与此特定组件中的 useI…...
十种排序算法(1) - 准备测试函数和工具
1.准备工作 我们先写一堆工具,后续要用,不然这些写在代码里可读性巨差 #pragma once #include<stdio.h>//为C语言定义bool类型 typedef int bool; #define false 0 #define true 1//用于交互a和b inline void swap(int* a, int* b) {/*int c *a…...
IRF联动 BFD-MAD
文章目录 IRF堆叠一、主设备配置二、备设备配置三、验证 MAD检测一、MAD检测二、MAD验证 本实验以2台设备进行堆叠示例,按照配置顺序,先配置主设备,再配置备设备。在IRF配置前暂时先不接堆叠线,按步骤提示接线。 IRF堆叠 一、主设…...
双向链表的初步练习
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
