哈希经典题目(C++)

文章目录

  • 前言
  • 一、两数之和
    • 1.题目解析
    • 2.算法原理
    • 3.代码编写
  • 二、判定是否互为字符重排
    • 1.题目解析
    • 2.算法原理
    • 3.代码编写
  • 三、 字⺟异位词分组
    • 1.题目解析
    • 2.算法原理
    • 3.代码编写
  • 总结


前言

哈希表是一个存储数据的容器,我们如果想要快速查找某个元素,就可以用哈希表,时间复杂度为O(1)。

一、两数之和

1.题目解析

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

2.算法原理

暴力解法

我们这里有两种暴露解法

解法一:

在这里插入图片描述

我们先固定right,left从right位置开始,一直寻找到n-1的位置。如果在某个位置发现了left+right=target。我们就返回这两个下标。否则right++,left=right,继续寻找。一直走到right=n-1为止。

解法二:

在这里插入图片描述

我们同样先固定right, left从0为止开始,一种走到right-1为止。
中间如果找到满足条件的就返回,如果找不到就继续right++,left从0为止开始寻找。一直走到right=n-1为止。

这两种算法时间复杂度为O(n*n),空间复杂度为O(1)

哈希解法

我们利用哈希表可以快速查找到一个值。

我们遇到一个值,先这个值与前面的值进行判断,查看是否有满足条件的。如果不满足,我们把这个值仍在哈希表中继续判断。

如果我们对另一种暴力解法进行优化,我们需要先把整个元素放在哈希表中,再进行二次遍历,因为可能存在元素相同的情况。
比如nums[ ]={2,4,6,-2,10};taarget=8.
r如果我们先固定4时,快速查找一遍,我们就会找到4,这就重复了,题目要求数组中同一个元素在答案里不能重复出现。
我们就只能另加判断处理了。

我们采用这种方法,将元素放入hash,同时见擦汗表中是否已经存在了当前元素所对应的目标元素(t-nums[ i ]),提高效率。

时间复杂度为O(n),空间复杂度O(n),空间换时间。

3.代码编写

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {//通过一个值快速查找到它的下标unordered_map<int,int>mp;int n=nums.size();for(int i=0;i<n;i++){int x=target-nums[i];if(mp.count(x)){return {i,mp[x]};}mp[nums[i]]=i;}return  {-1,-1};}
};

二、判定是否互为字符重排

1.题目解析

给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

示例 1:
输入: s1 = “abc”, s2 = “bca”
输出: true

示例 2:
输入: s1 = “abc”, s2 = “bad”
输出: false

说明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100

2.算法原理

如果能够构成重排,哪个字符串中每个字符出现的次数一定是相同的。

解法1:STL中哈希
我们可以用两个库里的哈希表实现,s1和s2都丢到哈希表中,遍历一遍,判断每个元素的个数是否相同。
这样做很复杂

解法2:数组模拟哈希表

本道题目明确说明了都是小写字母,我们可以开一个大小为26的数组,模拟哈希表的完成。我们只需要进行26次判断就可以了。

解法3:一个哈希表解决

我们可以在第二个解法的基础上,用一个数组完成。
先把s1中的字母放到数组中,再对s2进行遍历,如果在数组中,就进行减减操作。如果减到负数了,说明不匹配,返回false。

小优化:如果s1和s2长度都不相同,肯定不符合要求。
时间复杂度O(n),空间复杂度O(26)

3.代码编写

class Solution {
public:bool CheckPermutation(string s1, string s2) {//小优化if(s1.size()!=s2.size()){return false;}int hash[26]={0};//s1存元素for(auto&e:s1){hash[e-'a']++;}//s2进行--判断for(auto&e:s2){if((--hash[e-'a'])<0){return false;}}return true;}
};

三、 字⺟异位词分组

1.题目解析

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]

示例 2:
输入: strs = [“”]
输出: [[“”]]

示例 3:
输入: strs = [“a”]
输出: [[“a”]]

提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母

2.算法原理

互为字母异位词:排完序之后两个单词应该完全相同
我们可以利用这个特性,将单词按照字典序排序。
排序后,单词相同的话,就划分到同一组中。

排序后单词与原单词需要互相映射,我们可以用哈希表完成。
相同的单词划分到一组,我们可以用vector完成。

3.代码编写

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>>mp;//所有字母异位词分组for(auto&e:strs){//排序string s=e;sort(s.begin(),s.end());mp[s].push_back(e);}//提取结果vector<vector<string>>ret;for(auto& [x,y] : mp){ret.push_back(y);}return ret;}
};

总结

以上就是今天要讲的内容。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘

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

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

相关文章

【UE5:CesiumForUnreal】——加载无高度地形数据

目录 1.实现目的 2.数据准备 2.1下载数据 2.2 数据切片 3.加载无地形数据 1.实现目的 在CesiumForUnreal插件中&#xff0c;我们加载地图和地形图层之后&#xff0c;默认都是加载的带有高程信息的地形数据&#xff0c;在实际的项目和开发中&#xff0c;有时候我们需要加载无…

Vue3【三】 使用TS自己编写APP组件

Vue3【三】 使用TS自己编写APP组件 运行截图 目录结构 注意目录层级 文件源码 APP.vue <template><div class"app"><h1>你好世界!</h1></div> </template><script lang"ts"> export default {name:App //组…

【乐吾乐3D可视化组态编辑器】数据接入

数据接入 本文为您介绍3D数据接入功能&#xff0c;数据接入功能分为三个步骤&#xff1a;数据订阅、数据集管理、数据绑定 编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 数据订阅 乐吾乐3D组态数据管理功能由次顶部工具栏中按钮数据管理打开。 在新弹窗中选择数据订阅…

vue2 后端传年月日 时分秒 前端拿到当日时间 做对比 如果是当日的时间 筛选出来

getList () { this.loading true listAlarm(this.queryParams).then(response > { this.listData response.rows const currentDate new Date() const year currentDate.getFullYear() const month currentDate.getMonth() 1 // 月份是从 0 开始计数的&#xff0c;所以…

图像的IO操作

代码&#xff1a; import cv2 as cvimport matplotlib.pyplot as plt​#读取图像img cv.imread("../data/images/zidane.jpg")​#显示图像#2.1 OpenCVcv.imshow("dili",img)cv.waitKey(0)cv.destroyAllWindows()​#2.2 matplotlibplt.imshow(img[:,:,::-…

[matlab]折线图之多条折线如何绘制实心圆作为标记点

使用MarkerFaceColor是标记点填充的颜色&#xff0c;b&#xff0c;表示blue&#xff0c;蓝色 plot(x, a, d--, MarkerFaceColor, b); % 绘制仿真结果的曲线如果一张图多条曲线那么每条曲线需要单独调用一次plot&#xff0c;每个plot间用hold on 连接 plot(x, a, d--, MarkerF…

Oracle和mysql中插入时间字段

例如有id 和 times两个字段 Oracle insert into xxx values|(1,sysdate) mysql insert into xxx values(1,now()) 在 MySQL 中&#xff0c;SYSDATE() 函数也是可用的&#xff0c;它与 NOW() 类似&#xff0c;但略有不同&#xff1a; NOW…

Linux网络配置命令

文章目录 Linux网络配置的重要命令ifconfig命令网卡配置信息 hostname命令route命令创建一个路由创建默认路由删除路由&#xff1a; netstat命令ss命令lsof命令telnet命令ping命令traceroute命令nslookup命令两个重要相关文件 Linux网络配置的重要命令 ifconfig命令 ifconfig…

基于springboot实现社区养老服务系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现社区养老服务系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本社区养老服务系统就是在这样的大环境下诞生&#xff0c;其可以帮助…

从0开始学统计-什么是回归?

1.什么是回归&#xff1f; 回归&#xff08;Regression&#xff09;是统计学中一种用于探索变量之间关系的分析方法。它主要用于预测一个或多个自变量&#xff08;输入变量&#xff09;与因变量&#xff08;输出变量&#xff09;之间的关系。在回归分析中&#xff0c;我们尝试根…

PHP质量工具系列之php-depend

php-depend是一个开源的静态代码分析工具&#xff0c;它的主要功能包括&#xff1a; 代码质量分析 复杂度度量&#xff1a;计算类、方法和函数的Cyclomatic Complexity&#xff08;循环复杂度&#xff09;&#xff0c;帮助识别潜在的复杂代码段。 耦合度度量&#xff1a;分析类…

瑞鑫RK3588 画中画 OSD 效果展示

这些功能本来在1126平台都实现过 但是迁移到3588平台之后 发现 API接口变化较大 主要开始的时候会比较费时间 需要找到变动接口对应的新接口 之后 就比较好操作了 经过几天的操作 已实现 效果如下

刷代码随想录有感(95):合并区间

题干&#xff1a; 代码&#xff1a; class Solution { public:static bool cmp(vector<int>& a, vector<int>& b){return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begi…

MySQL排序操作

025排序操作 select .. from .. order by 字段 asc/descselect empno, ename, sal from emp order by sal asc;asc 不写的话&#xff0c;默认升序 多个字段排序 查询员工的编号、姓名、薪资&#xff0c;按照薪资升序排列&#xff0c;如果薪资相同的&#xff0c;再按照姓名升…

New Work-flow of Circuit Bootstrapping

参考文献&#xff1a; [CGGI17] Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrapping for TFHE. ASIACRYPT 2017 (1): 377-408.[CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion be…

爬取基金收盘价并用pyecharts进行展现

爬取基金收盘价并用pyecharts进行展现 一、用到的第三方包 因为使用到了一些第三方的包&#xff0c;包还是比较大的如果直接从社区下载比较费劲&#xff0c;所以建议配置国内镜像源&#xff0c;这里以清华的镜像源为例。 pip config set global.index-url https://pypi.tuna…

uni微信小程序editor富文本组件如何插入图片

需求 在editor中插入图片&#xff0c;并对图片进行编辑&#xff0c;简略看一下组件的属性&#xff0c;官网editor 组件 | uni-app官网 解决方案 首先要使用到ready这个属性&#xff0c;然后官网有给代码粘过来&#xff0c;简单解释一下这段代码的意思&#xff08;作用是在不同…

坐实了!“神坛企业”也是草台班子

越接近真相&#xff0c;越觉得荒诞&#xff01;这次就算删稿也得说两句&#xff0c;KP基于BMC的“可信计算”&#xff0c;正在沦为业内笑柄。戳破那层保护色&#xff0c;施施然端坐神坛的某厂&#xff0c;内里可能也是个草台班子。 近期&#xff0c;网上流传着几页HW给客户洗脑…

k8s-pod参数详解

目录 概述创建Pod编写一个简单的Pod添加常用参数为Pod的容器分配资源网络相关Pod健康检查启动探针存活探针就绪探针 作用整个Pod参数配置创建docker-registry 卷挂载 结束 概述 k8s中的pod参数详解。官方文档   版本 k8s 1.27.x 、busybox:stable-musl、nginx:stable-alpine3…

EXCEL多sheet添加目录跳转

EXCEL多sheet添加目录跳转 背景 excel中有几十个sheet&#xff0c;点下方左右切换sheet太耗时&#xff0c;希望可以有根据sheet名超链接跳转相应sheet&#xff0c;处理完后再跳回原sheet。 方案一 新建目录sheet&#xff0c;在A1写sheet名&#xff0c;右键选择最下方超链接…