day7:哈希表学习

news/2024/4/30 3:40:43/文章来源:https://blog.csdn.net/jbjhzstsl/article/details/137600379

● 454.四数相加II
● 383. 赎金信
● 15. 三数之和
● 18. 四数之和

总结

对于查,某个元素是否在集合中出现过,哈希法是非常高效的方法
但是对于需要去重的情况下,哈希法要注意太多细节,很难完美写完,因此采用双指针法,更便于去重

● 454.四数相加II

/*454. 四数相加 II
中等给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0*/#include <unordered_map>class Solution_454 {public:/** 暴力解法四层for循环,显然时间复杂度很高* 给出等式,可以根据等式遍历部分数组然后匹配查找需要的另外部分数组元素,即查找某个元素在集合中是否出现过,可以用哈希表,并且不用去重。* 因为四个独立数组,即使用哈希表也需要遍历求和,只是可以分开求,所以最好是两两分组,最多是两层for循环* 那思路就是用map保存两个数组之和及其出现次数,再遍历另外两个数组和,在map查询满足等式的元素是否存在,出现了多少次,从而得到结果* 使用无序map,底层实现是哈希,搜索效率高* O(n^2)*/int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int, int> record_map;for(auto a : nums1){//map保存两个数组之和及其出现次数for(auto b : nums2)++record_map[a + b];}int count = 0;for(auto c : nums3){for(auto d : nums4){auto itr = record_map.find((0 - (c + d)));if(itr != record_map.end())count += itr->second;}}return count;}
};

● 383. 赎金信

/*
383. 赎金信简单
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
*/
#include <unordered_set>
class Solution_383 {public:/**查找某个元素在集合中是否出现过,可以用哈希表* O(n),但是因为涉及到删除操作,复杂度更高*/bool canConstruct(string ransomNote, string magazine) {unordered_multiset<char> magazine_set(magazine.cbegin(), magazine.cend());for(auto i : ransomNote){auto itr = magazine_set.find(i);if(itr != magazine_set.end()){magazine_set.erase(itr);} elsereturn false;}return true;}/** 类似于242,可以用数组来保存元素及其出现次数,更快,* 还是哈希表思想* O(n),但是没有删除操作*/bool canConstruct_hash(string ransomNote, string magazine) {int record[26] = {0};for(auto i : magazine){record[i - 'a'] += 1;}for(auto i : ransomNote){if(record[i - 'a'] > 0){record[i - 'a'] -= 1;} elsereturn false;}return true;}
};

● 15. 三数之和

/** 15. 三数之和中等
提示给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。*/
#include <algorithm>
class Solution_15 {public:/** 暴力解法可以找到三元组,但是不知道怎么去重**关键是三元组内部可重复,但是多个三元组的元素不能重复,所以应该对三个元素进行去重操作* 对第一个元素的去重重点在于由后一个元素判断前一个元素是否相同,如果对前一个元素进行去重,会使得类似{-1, -1, 2}这样的三元组被去掉* 对双指针指向的两个元素去重关键是得在拿到第一个符合条件的三元组之后进行去重,负责类似于{0, 0, 0}这样的三元组会被去掉*///去重失败vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(), nums.end());for(int i = 0; i < nums.size(); ++i){if(nums[i] > 0)return res;if(i > 0){nums[i] = nums[i - 1];continue;}for(int j = i + 1; j < nums.size(); ++j){if(j > 0){nums[j] = nums[j - 1];continue;}for(int k = j + 1; k < nums.size(); ++k){if(k > 0){nums[k] = nums[k - 1];continue;}if(nums[i] + nums[j] + nums[k] == 0)res.push_back(vector<int>{nums[i], nums[j], nums[k]});}}}return res;}vector<vector<int>> threeSum_double_points(vector<int> &nums) {vector<vector<int>> res;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); ++i) {if (nums[i] > 0)return res;if (i > 0) {//去重,跟前一个比较,避免类似{-1, -1, 2}这样的三元组被去掉if (nums[i] == nums[i - 1])continue;}int left = i + 1;int right = nums.size() - 1;while (left < right) {if (nums[i] + nums[left] + nums[right] == 0) {res.push_back(vector<int>{nums[i], nums[left], nums[right]});while (left < right && nums[left] == nums[left + 1])//去重left += 1;while (left < right && nums[right] == nums[right - 1])//去重right -= 1;left += 1;right -= 1;} else if (nums[i] + nums[left] + nums[right] < 0) {left += 1;} else {right -= 1;}}}return res;}
};

● 18. 四数之和

/*18. 四数之和中等
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组[nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target你可以按 任意顺序 返回答案 。*/class Solution_18 {public:/** 跟15相同的解法*/vector<vector<int>> fourSum(vector<int> &nums, int target) {vector<vector<int>> res;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); ++i) {if(nums[i] > target)return res;if(i > 0 && nums[i] == nums[i - 1])continue;for (int j = i + 1; j < nums.size(); ++j) {if(j > 1 && nums[j] == nums[j - 1])continue;int left = j + 1;int right = nums.size() - 1;while (left < right) {if (nums[i] + nums[j] + nums[left] + nums[right] < target)left += 1;else if (nums[i] + nums[j] + nums[left] + nums[right] > target)right -= 1;else {res.push_back(vector<int>{nums[i], nums[j], nums[left], nums[right]});while (left < right && nums[left] == nums[left + 1])left += 1;while (left < right && nums[right] == nums[right - 1])right -= 1;left += 1;right -= 1;}}}}return res;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业计算机服务器中了locked勒索病毒怎么办,locked勒索病毒解密流程步骤

网络技术的不断发展为企业的生产运营提供了极大便利&#xff0c;也让企业的生产效率大大提高&#xff0c;但网络是一把双刃剑&#xff0c;给给企业的数据安全问题带来严重威胁。近期&#xff0c;云天数据恢复中心接到浙江某商贸公司的求助&#xff0c;企业计算机服务器遭到了lo…

网络驱动器设备:ISCSI服务器

文章目录 使用ISCSI服务部署网络存储ISCSI技术介绍创建RAID磁盘整列配置ISCSI服务端配置Windows端配置Linux客户端iSCSI服务器CHAP单向认证配置Linux端具体步骤Windows端具体步骤 使用ISCSI服务部署网络存储 主机名IPISCSI服务端192.168.200.10ISCSI客户端192.168.200.20Windo…

UE5、CesiumForUnreal实现加载建筑轮廓GeoJson数据生成白模功能

1.实现目标 在UE5.3中,通过加载本地建筑边界轮廓面GeoJson数据,获取底面轮廓和楼高数据,拉伸生成白模,并支持点选高亮。为防止阻塞Game线程,使用了异步任务进行优化,GIF动图如下所示: 其中建筑数量:128871,顶点索引数量:6695748,三角面数量:2231916,顶点数量:165…

Linux nsenter命令全面解析

Linux nsenter命令是一个强大的工具&#x1f6e0;️&#xff0c;用于进入到已存在的命名空间&#xff08;Namespace&#xff09;中执行命令。由于Linux的命名空间技术是构建容器技术的基础&#xff0c;nsenter因此成为了容器管理和调试中不可或缺的工具&#x1f433;。本文将从…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1&#xff09;git加入鼠标右键 2&#xff09;git clone源码 2、VSCode出场 1&#xff09;创建pyth…

vue实现验证码验证登录

先看效果&#xff1a; 代码如下&#xff1a; <template><div class"container"><div style"width: 400px; padding: 30px; background-color: white; border-radius: 5px;"><div style"text-align: center; font-size: 20px; m…

鲨鱼恐怖的第六感

除了视觉、嗅觉、听觉、味觉、触觉这五种感官&#xff0c; 鲨鱼还有敏锐的「第六感」&#xff1a;电觉&#xff0c;可以侦测微弱电场&#xff0c;捕捉猎物。 恐怖的背鳍划破水面&#xff0c;直逼我们而来─一头三公尺长的硕大青鲨&#xff0c;正如鱼雷般朝血腥气味方向游去。…

基于SSM的周边乡村旅游小程序

系统实现 游客注册通过注册窗口&#xff0c;进行在线填写自己的账号、密码、姓名、年龄、手机、邮箱等&#xff0c;信息编辑完成后核对信息无误后进行选择注册&#xff0c;系统核对游客所输入的账号信息是否准确&#xff0c;核对信息准确无误后系统进入到操作界面。 游客登录通…

Lesson1--数据结构前言

1. 什么是数据结构&#xff1f; 2. 什么是算法&#xff1f; 3. 数据结构和算法的重要性 4. 如何学好数据结构和算法 5. 数据结构和算法书籍及资料推荐 1. 什么是数据结构&#xff1f; 数据结构(Data Structure) 是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…

宁波银行交出2023年成绩单:高成长高质量,优质服务夯实金字招牌

撰稿 |多客 来源 | 贝多财经 4月9日&#xff0c;宁波银行&#xff08;SZ:002142&#xff09;交出了2023年的业绩答卷。透过财报不难发现&#xff0c;该行在业绩表现、资产质量、创新趋势、风控能力等方面均展现出了强韧的成长性&#xff0c;无愧城商行“优等生”之名。 进入2…

Android Studio学习15——多页面情况下再看Activity生命周期

按返回键退出APP时&#xff1a; 走正常页面的退出流程&#xff1a;onPause–>onStop–>onDestroy(会Destroy,因为它从任务栈中退出了) 再点击图标回来时&#xff1a; 走正常页面的创建流程&#xff1a;onCreate–>onStart–>onResume 按Home键退出App时&#xff1a…

鸿蒙实战开发-如何实现选择并查看文档与媒体文件

介绍 应用使用ohos.file.picker、ohos.multimedia.mediaLibrary、ohos.file.fs 等接口&#xff0c;实现了picker拉起文档编辑保存、拉起系统相册图片查看、拉起视频并播放的功能。 效果预览 使用说明&#xff1a; 在首页&#xff0c;应用展示出最近打开过的文档信息&#xf…

算法打卡day29

今日任务&#xff1a; 1&#xff09;1005.K次取反后最大化的数组和 2&#xff09;134.加油站 3&#xff09;135.分发糖果 1005.K次取反后最大化的数组和 题目链接&#xff1a;1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 给定一个整数数组 A&…

MySQL分库分表的方式有哪些

目录 一、为什么要分库分表 二、什么是分库分表 三、分库分表的几种方式 1.垂直拆分 2. 水平拆分 四、分库分表带来的问题 五、分库分表技术如何选型 一、为什么要分库分表 如果一个网站业务快速发展&#xff0c;那这个网站流量也会增加&#xff0c;数据的压力也会随之而…

使用pytorch构建有监督的条件GAN(conditional GAN)网络模型

本文为此系列的第四篇conditional GAN&#xff0c;上一篇为WGAN-GP。文中在无监督的基础上重点讲解作为有监督对比无监督的差异&#xff0c;若有不懂的无监督知识点可以看本系列第一篇。 原理 有条件与无条件 如图投进硬币随机得到一个乒乓球的例子可以看成是一个无监督的GAN&…

Harmony鸿蒙南向驱动开发-UART

UART指异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;是通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输。 两个UART设备的连接示意图如下&#xff0c;UART与其他模块一般用2线&a…

Golang快速入门教程(一)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字符 多行字符…

HWOD:投票统计

一、知识点 1、单词 候选人的英文是Candidate 投票的英文是vote 投票人的英文是voter 2、for循环 如果在for循环内将i置为n&#xff0c;结束该层循环后&#xff0c;for循环会先给i加1,然后再去判读i是否小于n&#xff0c;所以for循环结束后&#xff0c;i的值为n1 3、字符…

idm线程越多越好吗 idm线程数多少合适 IDM百度云下载 IDM下载器如何修改线程数

IDM&#xff08;Internet Download Manager&#xff09;是一款流行的网络下载器&#xff0c;它支持多线程下载&#xff0c;这意味着它可以同时建立多个连接来下载文件的不同部分&#xff0c;从而提高下载速度。我们在使用IDM的时候总是有很多疑问&#xff0c;今天我们学习IDM线…

Unity 遮罩

编辑器版本 2017.2.3f1 学习Unity的三张遮罩方式 1. Mask 遮罩方式 首先&#xff0c;在界面上创建2个Image&#xff0c;一个命名Img_Mask,大小设置 400* 400&#xff0c; 一个命名Img_Show,大小设置500*500。 然后&#xff0c;给 Img_Mask添加Mask,选择Img_Mask,点击Add Com…