当前位置: 首页 > article >正文

4.4刷题记录(哈希表)

1.242. 有效的字母异位词 - 力扣(LeetCode)

class Solution {
public:bool isAnagram(string s, string t) {unordered_map<char,int>cnt_s,cnt_t;for(int i=0;i<s.size();i++){cnt_s[s[i]]++;}for(int i=0;i<t.size();i++){cnt_t[t[i]]++;}if(cnt_s==cnt_t){return true;}return false;}
};

其中unorder_map判断是否相等的逻辑通过以下来实现

for (const auto& pair : map1) {// 在第二个 unordered_map 中查找当前键auto it = map2.find(pair.first);// 如果找不到键,或者键对应的值不相等,返回 falseif (it == map2.end() || it->second != pair.second) {return false;}}

2.383. 赎金信 - 力扣(LeetCode)

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {unordered_map<char,int>cnt_r,cnt_m;for(int i=0;i<ransomNote.size();i++){cnt_r[ransomNote[i]]++;}for(int i=0;i<magazine.size();i++){cnt_m[magazine[i]]++;}for(const auto& item1 : cnt_r){auto item2=cnt_m.find(item1.first);if(item2==cnt_m.end()||item1.second>item2->second){return false;}}return true;}
};

注意比较大小的时候find查找的是first的值,判断second是否相等的时候一个是.一个是箭头

3.349. 两个数组的交集 - 力扣(LeetCode)

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int>answer;unordered_map<int,int>cnt1,cnt2;for(int i=0;i<nums1.size();i++){cnt1[nums1[i]]++;}for(int i=0;i<nums2.size();i++){cnt2[nums2[i]]++;}for(const auto& item1 : cnt1){auto item2=cnt2.find(item1.first);if(item2!=cnt2.end()){answer.push_back(item2->first);}}return answer;}
};

4.49. 字母异位词分组 - 力扣(LeetCode)

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {//首先进行排序unordered_map<string,vector<string>>cnt;for(string str:strs){string key=str;sort(key.begin(),key.end());cnt[key].push_back(str);}vector<vector<string>>ans;for(const auto& item :cnt){ans.push_back(item.second);}return ans;}
};

先排序然后将排序过后的放在一个vector,简单高效,值得学习

5.438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

class Solution {
public:vector<int> findAnagrams(string s, string p) {unordered_map<char,int>cnts,cntp;vector<int>ans;if(s.size()<p.size()){return ans;}for(int i=0;i<p.size();i++){cntp[p[i]]++;cnts[s[i]]++;}if(cntp==cnts){ans.push_back(0);}for(int i=p.size();i<s.size();i++){//现在删除左面的元素if(--cnts[s[i-p.size()]]==0){cnts.erase(s[i-p.size()]);}//增加右边的元素cnts[s[i]]++;if(cntp==cnts){ans.push_back(i-p.size()+1);}}return ans;}
};

6.350. 两个数组的交集 II - 力扣(LeetCode)

class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {unordered_map<int,int>cnt1,cnt2;vector<int>answer;for(int i=0;i<nums1.size();i++){cnt1[nums1[i]]++;}for(int i=0;i<nums2.size();i++){cnt2[nums2[i]]++;}for(const auto& item1:cnt1){auto item2=cnt2.find(item1.first);if(item2==cnt2.end()){continue;}else{for(int i=0;i<min(item1.second,item2->second);i++){answer.push_back(item1.first);}}}return answer;}
};

7.202. 快乐数 - 力扣(LeetCode)

第一种方法比较巧妙(借助快慢指针),第二种比较普遍(利用hash_set)。

class Solution {
public:int sumsqure(int n){int sum=0;while(n!=0){int a=n%10;sum+=a*a;n=n/10;}return sum;} bool isHappy(int n) {int fast=n,slow=n;do{fast=sumsqure(fast);fast=sumsqure(fast);slow=sumsqure(slow);}while(fast!=slow);return fast==1;}
};
class Solution {
public:// 取数值各个位上的单数之和int getSum(int n) {int sum = 0;while (n) {sum += (n % 10) * (n % 10);n /= 10;}return sum;}bool isHappy(int n) {unordered_set<int> set;while(1) {int sum = getSum(n);if (sum == 1) {return true;}// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return falseif (set.find(sum) != set.end()) {return false;} else {set.insert(sum);}n = sum;}}
};

8.1. 两数之和 - 力扣(LeetCode)

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int>ans;unordered_map<int,int>cnt;for(int i=0;i<nums.size();i++){auto item = cnt.find(target-nums[i]);if(item!=cnt.end()){ans.push_back(i);ans.push_back(item->second);break;}cnt.insert(pair<int,int>(nums[i],i));}return ans;}
};

9.454. 四数相加 II - 力扣(LeetCode)

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int>sum1,sum2;//1.首先存储nums1,nums2for(int i=0;i<nums1.size();i++){for(int j=0;j<nums2.size();j++){sum1[nums1[i]+nums2[j]]++;}}//2.进行求和int count=0;for(int i=0;i<nums3.size();i++){for(int j=0;j<nums4.size();j++){auto item=sum1.find(0-nums3[i]-nums4[j]);if(item!=sum1.end()){count+=item->second;}}}//3.输出return count;}
};

10.15. 三数之和 - 力扣(LeetCode)

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {unordered_map<int, int> count; // 统计每个数字的出现次数set<vector<int>> ans_set; // 用于去重vector<vector<int>> ans; // 最终结果// 统计每个数字的出现次数for (int num : nums) {count[num]++;}// 遍历所有可能的两个数字组合for (const auto& [a, count_a] : count) {for (const auto& [b, count_b] : count) {int c = -(a + b); // 第三个数字// 检查第三个数字是否存在if (count.find(c) != count.end()) {// 创建一个临时三元组vector<int> triplet = {a, b, c};sort(triplet.begin(), triplet.end()); // 排序以便去重// 检查是否满足条件if (a == b && b == c) { // a == b == cif (count[a] >= 3) {ans_set.insert(triplet);}} else if (a == b) { // a == b != cif (count[a] >= 2 && count[c] >= 1) {ans_set.insert(triplet);}} else if (b == c) { // a != b == cif (count[b] >= 2 && count[a] >= 1) {ans_set.insert(triplet);}} else if (a == c) { // b != a == cif (count[a] >= 2 && count[c] >= 1) {ans_set.insert(triplet);}} else { // a != b != cif (count[a] >= 1 && count[b] >= 1 && count[c] >= 1) {ans_set.insert(triplet);}}}}}// 将结果从集合转换为向量for (const auto& vec : ans_set) {ans.push_back(vec);}return ans;}
};

另一种方法:双指针法(此代码及其考虑去重问题,而且运用到了双指针。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//1.使用双指针法sort(nums.begin(),nums.end());vector<vector<int>>answer;for(int i=0;i<nums.size();i++){if(nums[i]>0){return answer;}//首先对nums[i]去重if(i>0&&nums[i-1]==nums[i]){continue;}int left=i+1,right=nums.size()-1;while(left<right){if(nums[i]+nums[left]+nums[right]==0){answer.push_back({nums[i],nums[left],nums[right]});//接下来对left和right进行去重while(left<right && nums[left]==nums[left+1]){left++;}while(right>left && nums[right]==nums[right-1]){right--;}left++;right--;}else if(nums[i]+nums[left]+nums[right]>0){right--;}else{left++;}}}return answer;}
};

11.18. 四数之和 - 力扣(LeetCode)​​​​​​

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(),nums.end());vector<vector<int>> ans;for (int i = 0; i < nums.size(); i++) {if(nums[i]>target&&nums[i]>=0){break;}if(i>0&& nums[i]==nums[i-1]){continue;}for (int j = i + 1; j < nums.size(); j++) {if(nums[i]+nums[j]>target&&(nums[i]+nums[j])>=0){break;}if (j>i+1 && nums[j] == nums[j - 1]) {continue;}int left = j + 1, right = nums.size() - 1;while (left < right) {if ((long)nums[i] + nums[j] + nums[left] + nums[right] == target) {ans.push_back({nums[i], nums[j],nums[left], nums[right]});// 接下来对left和right进行去重while (left < right && nums[left] == nums[left + 1]) {left++;}while (right > left && nums[right] == nums[right - 1]) {right--;}left++;right--;} else if ((long)nums[i]+nums[j] + nums[left] + nums[right] > target) {right--;} else {left++;}}}}return ans;}
};

相关文章:

4.4刷题记录(哈希表)

1.242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool isAnagram(string s, string t) {unordered_map<char,int>cnt_s,cnt_t;for(int i0;i<s.size();i){cnt_s[s[i]];}for(int i0;i<t.size();i){cnt_t[t[i]];}if(cnt_sc…...

代码随想录回溯算法03

93.复原IP地址 本期本来是很有难度的&#xff0c;不过 大家做完 分割回文串 之后&#xff0c;本题就容易很多了 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;回溯算法如何分割字符串并判断是合法IP&#xff1f;| LeetCode&#xff1a;93.复原IP地址_哔哩哔…...

批量改CAD图层颜色——CAD c#二次开发

一个文件夹下大量图纸&#xff08;几百甚至几千个文件&#xff09;需要改图层颜色时&#xff0c;可采用插件实现&#xff0c;效果如下&#xff1a; 转换前&#xff1a; 转换后&#xff1a; 使用方式如下&#xff1a;netload加载此dll插件&#xff0c;输入xx运行。 附部分代码如…...

【内网安全】DHCP 饿死攻击和防护

正常情况&#xff1a;PC2可以正常获取到DHCP SERVER分别的IP地址查看DHCP SERCER 的ip pool地址池可以看到分配了一个地址、Total 253个 Used 1个 使用kali工具进行模拟攻击 进行DHCP DISCOVER攻击 此时查看DHCP SERVER d大量的抓包&#xff1a;大量的DHCP Discover包 此时模…...

【愚公系列】《高效使用DeepSeek》055-可靠性评估与提升

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

AI时代编程教育启示录:为什么基础原理依然不可或缺?

李升伟 编译 在生成式AI重塑编程教育的今天&#xff0c;我作为拥有十年开发者关系团队管理经验、编程训练营教学经历的专业软件工程师&#xff0c;想与大家探讨这个新时代的编程教育之道。 ‌平衡之道&#xff1a;基础原理与AI工具的博弈‌ 当GitHub Copilot、Amazon Q Deve…...

10种电阻综合对比——《器件手册--电阻》

二、电阻 前言 10种电阻对比数据表 电阻类型 原理 特点 应用 贴片电阻 贴片电阻是表面贴装元件&#xff0c;通过将电阻体直接贴在电路板上实现电路连接 体积小、重量轻&#xff0c;适合高密度电路板&#xff1b;精度高、稳定性好&#xff0c;便于自动化生产 广泛应用于…...

剑指Offer(数据结构与算法面试题精讲)C++版——day6

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day6 题目一&#xff1a;不含重复字符的最长子字符串题目二&#xff1a;包含所有字符的最短字符串题目三&#xff1a;有效的回文 题目一&#xff1a;不含重复字符的最长子字符串 这里还是可以使用前面&#x…...

freertos韦东山---事件组以及实验

事件组的原理是什么&#xff0c;有哪些优点&#xff0c;为啥要创造出这个概念 在实时操作系统&#xff08;如 FreeRTOS&#xff09;中&#xff0c;事件组是一种用于任务间同步和通信的机制&#xff0c;它的原理、优点及存在意义如下&#xff1a; 事件组原理 数据结构&#xf…...

架构师面试(二十六):系统拆分

问题 今天我们聊电商系统实际业务场景的问题&#xff0c;考查对业务系统问题的分析能力、解决问题的能力和对系统长期发展的整体规划能力。 一电商平台在早期阶段业务发展迅速&#xff0c;DAU在 10W&#xff1b;整个电商系统按水平分层架构进行设计&#xff0c;包括【入口网关…...

Spring 中的事务

&#x1f9fe; 一、什么是事务&#xff1f; &#x1f9e0; 通俗理解&#xff1a; 事务 一组操作&#xff0c;要么全部成功&#xff0c;要么全部失败&#xff0c;不能只做一半。 比如你转账&#xff1a; A 账户扣钱B 账户加钱 如果 A 扣了钱但 B 没收到&#xff0c;那就出问…...

Java中的同步和异步

一、前言 在Java中&#xff0c;同步&#xff08;Synchronous&#xff09;和异步&#xff08;Asynchronous&#xff09;是两种不同的任务处理模式。核心区别在任务执行的顺序控制和线程阻塞行为。 二、同步&#xff08;Synchronous&#xff09; 定义&#xff1a;任务按顺序执行…...

vue2 vue3 响应式差异

vue2 响应式原理看这 链接: link 总结&#xff1a; object.defineproperty()是对属性的劫持&#xff0c;对属性劫持有两大缺陷 1. 需要遍历对象的所有属性&#xff0c;深层属性需递归&#xff0c;存在效率问题 2. 后添加的属性&#xff0c;无法获得响应式&#xff0c;因为劫持…...

唯一ID生成器设计方案

《亿级流量系统架构设计与实战》总结 1. 唯一ID的核心需求 • 全局唯一性&#xff1a;分布式系统中所有节点生成的ID不可重复。 • 趋势递增性&#xff08;可选&#xff09;&#xff1a;ID按时间或序列递增&#xff0c;优化数据库写入性能。 • 高可用性&#xff1a;服务需72…...

OpenCV 图形API(16)将极坐标(magnitude 和 angle)转换为笛卡尔坐标(x 和 y)函数polarToCart()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 计算二维向量的 x 和 y 坐标。 polarToCart 函数根据 magnitude 和 angle 的对应元素表示的每个二维向量&#xff0c;计算其笛卡尔坐标&#xff1a;…...

在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重构二开的开源项目 Dify-Plus

一、安装环境信息说明 硬件资源&#xff08;GB 和 GiB 的主要区别在于它们的换算基数不同&#xff0c;GB 使用十进制&#xff0c;GiB 使用二进制&#xff0c;导致相同数值下 GiB 表示的容量略大于 GB&#xff1b;换算关系&#xff1a;1 GiB ≈ 1.07374 GB &#xff1b;1 GB ≈ …...

安装和配置Docker

其他版本的安装方式可直接参考官方网站&#xff0c;推荐通过官方网站提供的方式安装Dockers&#xff0c;下面只是个演示的示例&#xff0c;仅供参考 Install | Docker Docs 安装 Docker 的前置准备 1.虚拟机配置&#xff1a; 推荐配置 内存&#xff1a;4GB&#xff08;最低…...

Ansible YAML 基础语法与关键词 的详细指南

以下是 Ansible YAML 基础语法与关键词 的详细指南&#xff0c;帮助你快速掌握 Playbook 编写规范和核心概念&#xff1a; 目录 一、Ansible Playbook 基础结构1. YAML 文件基础 二、核心关键词1. Play 定义2. Task 定义3. Handler 定义4. 变量&#xff08;Variables&#xff0…...

NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)

贪⼼算法是两极分化很严重的算法。简单的问题会让你觉得理所应当&#xff0c;难⼀点的问题会让你怀疑⼈⽣ 什么是贪⼼算法&#xff1f; 贪⼼算法&#xff0c;或者说是贪⼼策略&#xff1a;企图⽤局部最优找出全局最优。 把解决问题的过程分成若⼲步&#xff1b;解决每⼀步时…...

瑞萨RA4M2使用心得-KEIL5的第一次编译

目录 前言 环境&#xff1a; 开发板&#xff1a;RA-Eco-RA4M2-100PIN-V1.0 IDE&#xff1a;keil5.35 一、软件的下载 编辑瑞萨的芯片&#xff0c;除了keil5 外还需要一个软件&#xff1a;RASC 路径&#xff1a;Releases renesas/fsp (github.com) 向下找到&#xff1a; …...

java根据集合中对象的属性值大小生成排名

1&#xff1a;根据对象属性降序排列 public static <T extends Comparable<? super T>> LinkedHashMap<T, Integer> calculateRanking(List<ProductPerformanceInfoVO> dataList, Function<ProductPerformanceInfoVO, T> keyExtractor) {Linked…...

数据分析-Excel-学习笔记

Day1 复现报表聚合函数&#xff1a;日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格&#xff0c;首先要看这个表格个构成&#xff08;包含了哪些数据&#xff09;&#xff0c;几行几列&#xff0c;每一列的名称…...

整车CAN网络和CANoe

车载网络中主要包含有Can网络,Lin网络,FlexRay,Most,以太网。 500kbps:500波特率,表示的数据传输的速度。表示的是最大的网速传输速度。也就是每秒 500kb BodyCan车身Can InfoCan娱乐信息Can 车身CAN主要连接的是ESB电动安全带 ADB自适应远光灯等 PTCan动力Can 底盘Can...

ChatGPT 的新图像生成器非常擅长伪造收据

本月&#xff0c;ChatGPT 推出了一种新的图像生成器&#xff0c;作为其 4o 模型的一部分&#xff0c;该模型在生成图像内的文本方面做得更好。 人们已经在利用它来生成假的餐厅收据&#xff0c;这可能会为欺诈者使用的已经很广泛的 AI 深度伪造工具包添加另一种工具。 多产的…...

JS页面尺寸事件

元素位置 在这里插入图片描述 父元素带有定位时输出相对于父亲元素的距离值...

SpringBoot的日志框架

目录 默认日志框架 日志配置 更换日志框架 排除默认Logback 引入目标日志框架 添加配置文件 logback.xml SpringBoot的核心设计宗旨是约定大于配置,很多框架功能都给你默认加载和配置完成供你使用,但这就要求使用者对框架有一定的理解和改造能力,比如这个日志框架,是其…...

网络协议之基础介绍

写在前面 本文看下网络协议相关基础内容。 1&#xff1a;为什么要有网络协议 为了实现世界各地的不同主机的互联互通。 2&#xff1a;协议的三要素 协议存在的目的就是立规矩&#xff0c;无规矩不成方圆嘛&#xff01;但是这个规矩也不是想怎么立就怎么立的&#xff0c;也…...

【学Rust写CAD】34 精确 Alpha 混合函数(argb.rs补充方法)

源码 #[inline]pub fn over_exact(self, dst: Argb) -> Argb {let a 255 - self.alpha32();let t dst.rb() * a 0x80_00_80;let mut rb (t ((t >> 8) & Argb::MASK)) >> 8;rb & Argb::MASK;rb self.rb();// saturaterb | 0x1000100 - ((rb >&…...

利用NumPy核心知识点优化TensorFlow模型训练过程

利用NumPy核心知识点优化TensorFlow模型训练过程 NumPy是Python科学计算的基础库&#xff0c;掌握它的高效操作可以显著提升TensorFlow模型的训练效率。本文详细探讨如何将NumPy的核心优势应用于TensorFlow模型训练的各个环节。 1. 数据预处理优化 高效向量化操作 NumPy的向…...

初识数据结构——Java集合框架解析:List与ArrayList的完美结合

&#x1f4da; Java集合框架解析&#xff1a;List与ArrayList的完美结合 &#x1f31f; 前言&#xff1a;为什么我们需要List和ArrayList&#xff1f; 在日常开发中&#xff0c;我们经常需要处理一组数据。想象一下&#xff0c;如果你要管理一个班级的学生名单&#xff0c;或…...