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

【算法】哈希表相关

【ps】本篇有 5 道 leetcode OJ。 

一、算法简介

        哈希表是一种存储数据的容器,可以快速查找某个元素,其查找的时间复杂度为 O(1),非常合适需要频繁查找某一个元素的场景。其具体用法为:

  • 直接使用底层为哈希表的 STL 容器。
  • 用数组模拟简易的哈希表,例如利用数组统计字符串中字符的频次、整型的数据范围很小时映射某些值等。

二、相关例题

1)两数之和

1. 两数之和

.1- 题目解析

        不难想到暴力解法,两层 for 循环将所有组合枚举一遍,即可找到答案。 

        不过,我们还可以用一个 unordered_map 来记录原始数组中每个元素的下标,而要找到和为  target 的两个元素,只需在遍历到原始数组中一个元素 x 时,查询哈希表中是否有值为 target - x 的原始数组元素,有则返回这两个元素作为最终结果。

.2- 代码编写

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> hash;for(int i=0;i<nums.size();i++){int x=target-nums[i];//有则返回结果if(hash.count(x))return {hash[x],i};//将当前元素统计入哈希表hash[nums[i]]=i;}return {-1,-1};}
};

2)判定是否互为字符重排

面试题 01.02. 判定是否互为字符重排

.1- 题目解析

        如果两个字符串 s1 和 s2 是互为字符重排的,那么它们中的字符相应出现的频次是相同的,我们可以用一个数组来模拟哈希表,统计两个字符串中字符出现的频次。

.2- 代码编写

//写法1:用两个哈希表分别统计后再比对
class Solution {
public:bool CheckPermutation(string s1, string s2) {if(s1.size()!=s2.size())return false;int hash1[26]={0};int hash2[26]={0};for(auto ch:s1)hash1[ch-'a']++;for(auto ch:s2){hash2[ch-'a']++;}for(int i=0;i<26;i++){if(hash1[i]!=hash2[i])return false;}return true;}
};
//写法2:用一个哈希表来统计和比对
class Solution {
public:bool CheckPermutation(string s1, string s2) {if(s1.size()!=s2.size())return false;int hash[26]={0};for(auto ch:s1)hash[ch-'a']++;for(auto ch:s2){hash[ch-'a']--;if(hash[ch-'a']<0)return false;}return true;}
};

3)存在重复元素

217. 存在重复元素

.1- 题目解析

        直接用一个哈希表统计数字出现的频次即可。

.2- 代码编写

class Solution {
public:bool containsDuplicate(vector<int>& nums) {unordered_map<int,int> hash;for(auto x:nums){hash[x]++;if(hash[x]%2==0)return true;}return false;}

4)存在重复元素 II

219. 存在重复元素 II

.1- 题目解析

        这道题相较于上一道,哈希表的映射关系不再是 <数字,频次>,而应是 <数字,在原数组中的下标>;返回条件不再是数字出现的频次为 2,而是相同两数的下标之差小于 k。

 

.2- 代码编写

class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int,int> hash;for(int i=0;i<nums.size();i++){if(hash.count(nums[i])){if(i-hash[nums[i]]<=k)return true;}hash[nums[i]]=i;}return false;}
};

5)字母异位词分组

49. 字母异位词分组

.1- 题目解析

        字母异位词之间,字符出现的频次是相同的。我们可以对每一个词通过 ascii 码来进行排序,将排序结果相同的放在一起,即放在一个字符串数组中,由此,我们可以用一个哈希表来存储结果,哈希表中的映射关系是 <排序后的字符串,同组的字母异位词>。

.2- 代码编写

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {//用哈希表对字母异位词分组unordered_map<string,vector<string>> hash;for(auto& s:strs){string tmp=s;sort(tmp.begin(),tmp.end());hash[tmp].push_back(s);}//构建返回结果vector<vector<string>> ret;for(auto&[x,y]:hash)ret.push_back(y);return ret;}
};

相关文章:

【算法】哈希表相关

【ps】本篇有 5 道 leetcode OJ。 一、算法简介 哈希表是一种存储数据的容器&#xff0c;可以快速查找某个元素&#xff0c;其查找的时间复杂度为 O(1)&#xff0c;非常合适需要频繁查找某一个元素的场景。其具体用法为&#xff1a; 直接使用底层为哈希表的 STL 容器。用数组…...

企微机器人:企业数字化转型的得力助手

在数字化转型的浪潮中&#xff0c;企业对于提高运营效率、降低人力成本的需求日益迫切。企微机器人&#xff0c;作为基于企业微信平台开发的一种智能工具&#xff0c;以其高度自动化、灵活性强、安全性高和易于使用的特点&#xff0c;迅速成为企业内部的得力助手。本文将深入探…...

Linux编程之socket入门教程 socket通讯原理

在Linux网络编程中&#xff0c;套接字Socket是进程间通信的基础&#xff0c;用来在网络上不同主机间进行数据的发送和接收。套接字作为一种抽象的接口&#xff0c;它屏蔽了底层网络协议的复杂性&#xff0c;使得开发者可以专注于数据的传输。以下将详细介绍Linux网络编程中的So…...

Windows上安装RabbitMQ

rabbitmq是干嘛的我就不介绍了&#xff0c;直接开始安装教程。 搭建成功演示图 下载安装包 https://pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51​pan.baidu.com/s/1ZlCFxh9Q00ynSU3ZCpTC9Q?pwdry51 下载完后有两个包(erlang和rabbitmq) 先安装otp_win64_24.1.7.exe…...

【C++ 高频面试题】构造函数和析构函数你了解多少呢?

文章目录 1. 什么是构造函数和析构函数2. 构造函数和析构函数可以是虚函数吗3. 构造函数有哪几种4. 深拷贝和浅拷贝的区别 1. 什么是构造函数和析构函数 &#x1f427; 构造函数&#xff1a; 构造函数是在创建对象时自动调用的特殊成员函数。 目的&#xff1a;初始化对象的成…...

linux中vim介绍以及常用命令大全

前言 在Linux系统中&#xff0c;Vim是一个功能强大的文本编辑器&#xff0c;它广泛应用于服务器管理、脚本编写和程序开发中。Vim拥有两种模式&#xff1a;命令模式和插入模式。了解和掌握常用的Vim命令对于提高文本编辑效率至关重要。本文将详细介绍Vim的常用命令&#xff0c…...

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相…...

CSS“多列布局”(补充)——WEB开发系列35

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​column…...

UI自动化测试痛点解决方案

前言 UI自动化测试可以快速、准确地执行大量的测试用例&#xff0c;减少人工测试所需的时间和劳动力。能够在短时间内完成多个测试用例的执行&#xff0c;提高测试的效率和速度。但是UI自动化有个最大的痛点。当前端界面发生变化时&#xff0c;往往页面元素定位也会改变&#…...

如何将QAD系统EDI模块无缝迁移到知行之桥?

什么是QAD系统&#xff1f; QAD&#xff08;Quality, Applications, Development&#xff09;系统&#xff0c;是专为制造业设计的一款ERP软件&#xff0c;主要包含供应链管理、生产管理、财务和客户管理等业务功能&#xff0c;这家公司1979年成立于美国&#xff0c;目前在汽车…...

Linux学习-ELK(一)

配置三台elasticsearch服务器 安装包 elasticsearch.j2 报错 #---执行rsync命令报以下错误 [rootes1 ~]# rsync -av /etc/hosts 192.168.29.172:/etc/hosts root192.168.29.172s password: bash: rsync: 未找到命令 rsync: connection unexpectedly closed (0 bytes receive…...

Selenium事件监听

引言 你一定总是渴望从WebDriver中获得更多的日志信息,以便调试你的脚本或记录更多有关测试的信息。这里为你提供了解决方案:EventFiringWebDriver 和 WebDriverEventListener。EventFiringWebDriver 是一个类,用于包装你的WebDriver以抛出事件,而WebDriverEventListener是…...

视频写作入门:9个步骤开始您的视频日志并与观众建立真实的联系

视频博客&#xff08;vlogging&#xff09;通过视频内容帮助你独特的声音和故事被听到&#xff0c;这能与你的观众建立强烈而有意义的联系&#xff0c;从而促进你的业务发展。使用光年AI平台&#xff0c;你可以将业务场景无缝接入AI能力&#xff0c;轻松实现私域流量的增长。 …...

使用豆包MarsCode 编写 Node.js 全栈应用开发实践

以下是「豆包MarsCode 体验官」优秀文章&#xff0c;作者狼叔。 欢迎更多用户使用豆包MarsCode 并分享您的产品使用心得及反馈、创意项目开发等&#xff0c;【有奖征集&#xff5c;人人都是豆包MarsCode 测评官&#xff01;】活动正在火热进行中&#xff0c;欢迎大家投稿参加&a…...

Spring Cloud全解析:熔断之Hystrix执行流程

Hystrix执行流程 每次调用创建一个新的HystrixCommand&#xff0c;把依赖调用封装在run()方法中执行execute()/queue做同步或异步调用判断熔断器(circuit-breaker)是否打开&#xff0c;如果打开则执行fallback进行降级策略&#xff0c;如果关闭继续执行判断线程池/队列/信号量…...

大模型算法岗,面试百问百答,7天3个offer拿到手!

导读 大模型时代很多企业都在开发自己的大模型&#xff0c;这直接刺激了大模型岗位的需求。本文为大家整理了大模型面试相关的知识点&#xff0c;希望对大家面试求职有所帮助。 今天分享大模型面试相关知识点&#xff0c;持续更新。 1. RAG技术体系的总体思路 数据预处理->…...

代码随想录算法day32 | 动态规划算法part05 | 完全背包,518. 零钱兑换 II, 377. 组合总和 Ⅳ,70. 爬楼梯 (进阶)

完全背包理论基础 本题力扣上没有原题&#xff0c;大家可以去卡码网第52题 (opens new window)去练习&#xff0c;题意是一样的。 完全背包 有N件物品和一个最多能背重量为W的背包。第 i 件物品的重量是 weight[i]&#xff0c;得到的价值是 value[i] 。每件物品都有无限个&…...

【Linux 从基础到进阶】自动化备份与恢复策略

自动化备份与恢复策略 在 Linux 运维中,数据的安全性至关重要,自动化备份与恢复策略是保障系统和数据安全的核心环节。无论是系统配置文件、用户数据、数据库还是应用程序日志,备份和恢复都能为系统灾难恢复、数据丢失等突发情况提供可靠的解决方案。 本文将介绍如何在 Ce…...

前端打包装包——设置镜像

1、打包失败&#xff0c;因为没装包&#xff0c;装包失败&#xff0c;因为装包的源错误 npm config get registry npm config set registry https://registry.npmmirror.com/npm install npm run build还是失败&#xff0c;因为缺少了包&#xff0c;在package.json文件中没有包…...

volatile 的作用?是否具有原子性,对编译器有什么影响?什么情况下一定要用 volatile, 能否和 const 一起使用?

目录 1. volatile 的作用 2. 是否具有原子性 3. 对编译器的影响 4.volatile 的使用场景 5.volatile 和 const 的组合 1. volatile 的作用 防止编译器优化&#xff1a;volatile 告诉编译器&#xff0c;变量的值可能会在程序的其他地方&#xff08;如硬件中断、其他线程等&…...

OpenClaw会议纪要大师:Qwen3-32B实时转录飞书语音会议

OpenClaw会议纪要大师&#xff1a;Qwen3-32B实时转录飞书语音会议 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。作为团队的技术负责人&#xff0c;我每周要参加至少8场跨部门会议&#xff0c;传统的手动记录方式让我苦不堪言——要么记录不全重点&…...

告别卡顿!GSYVideoPlayer的ExoPlayer内核配置全攻略(支持HLS/m3u8直播流)

GSYVideoPlayer的ExoPlayer内核深度调优&#xff1a;打造极致流畅的HLS直播体验 去年接手一个海外直播项目时&#xff0c;遇到最头疼的问题就是m3u8流媒体的卡顿和延迟。测试了各种方案后&#xff0c;最终通过GSYVideoPlayer的ExoPlayer内核解决了这个难题。今天就把这些实战经…...

Qwen2.5-VL-7B-Instruct应用场景:法律合同关键条款图文定位与摘要生成

Qwen2.5-VL-7B-Instruct应用场景&#xff1a;法律合同关键条款图文定位与摘要生成 想象一下&#xff0c;你是一位法务人员或商务经理&#xff0c;面前摆着一份几十页、图文并茂的复杂合同。你需要快速找到关于“违约责任”、“付款条件”或“知识产权归属”的关键条款。传统的…...

DeepSeek-OCR实战教程:批量处理脚本编写与异步解析任务队列设计

DeepSeek-OCR实战教程&#xff1a;批量处理脚本编写与异步解析任务队列设计 1. 学习目标与场景引入 如果你正在处理大量的文档图片&#xff0c;比如扫描的合同、发票、报告或者历史档案&#xff0c;一张张上传到DeepSeek-OCR界面手动处理&#xff0c;不仅效率低下&#xff0c…...

华为光猫配置解密工具技术架构解析与实现机制

华为光猫配置解密工具技术架构解析与实现机制 【免费下载链接】HuaWei-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/hu/HuaWei-Optical-Network-Terminal-Decoder 在网络设备运维领域&#xff0c;华为光猫配置文件的安全加密机制为设备…...

第4章 编码规范-4.1 命名规范

在Python中&#xff0c;变量、常量、模块、包、函数、类、对象、属性、方法和异常类都具有一定的命名规范。但是&#xff0c;这些命名规范都是通用性规范&#xff0c;而不是强制性规范&#xff0c;所以具体的命名规范还需要以开发项目的要求为主。&#xff08;1&#xff09;变量…...

Flux.1-Dev深海幻境作品集:LSTM时序灵感驱动的系列艺术创作

Flux.1-Dev深海幻境作品集&#xff1a;LSTM时序灵感驱动的系列艺术创作 最近在尝试一些AI艺术创作的新玩法&#xff0c;发现了一个特别有意思的组合&#xff1a;用LSTM模型来“读”故事&#xff0c;再用Flux.1-Dev模型来“画”故事。听起来有点抽象&#xff1f;简单说&#xf…...

HFSS建模进阶:如何高效使用布尔运算和局部坐标系(实战案例解析)

HFSS建模进阶&#xff1a;布尔运算与局部坐标系的高效实战指南 在微波器件和天线设计的数字世界里&#xff0c;精确的三维建模往往是成功仿真的第一步。当您已经掌握了HFSS的基础建模操作后&#xff0c;如何将建模效率提升到专业水平&#xff1f;本文将带您深入探索两个常被忽视…...

保姆级教程:在银河麒麟V10桌面版上,用Docker容器化部署SpringBoot + 达梦数据库应用

银河麒麟V10桌面版容器化实战&#xff1a;SpringBoot与达梦数据库的Docker化部署指南 在国产化技术栈日益成熟的今天&#xff0c;将传统应用迁移到容器化环境已成为提升部署效率和系统可移植性的关键路径。银河麒麟V10作为国产操作系统的代表&#xff0c;结合飞腾CPU的硬件生态…...

手把手教你魔改YOLOv8:从CSPPC到SPPELAN的实战调优(新手友好版)

1. 为什么需要魔改YOLOv8&#xff1f; 目标检测是计算机视觉领域最基础也最实用的技术之一&#xff0c;而YOLOv8作为当前最流行的实时检测框架&#xff0c;凭借其出色的速度和精度平衡&#xff0c;已经成为工业界和学术界的首选。但在实际项目中&#xff0c;我们经常会遇到一些…...