哈希经典题目(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;

    }
};

for(auto& [x,y] : mp)注意一下这种写法

总结

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

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

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

相关文章

空间搜索geohash概述

概述 通常在一些2C业务场景中会根据用户的位置来搜索一些内容。通常提供位置搜索的都是直接通过redis/mongodb/es等中间件实现的。 但是这些中间件又是怎么实现位置搜索的呢&#xff1b; 查了一番资料&#xff0c;发现背后一个公共的算法Geohash。 Geohash 经度和纬度是2个…

BL104网关钡铼技术多协议设备互操作简单一键接入

在工业环境中&#xff0c;设备之间的通信和互操作性是实现智能化生产的关键。为了满足这一需求&#xff0c;钡铼技术推出了PLC物联网关BL104&#xff0c;一款专为工业环境设计的多协议设备&#xff0c;简化了设备互操作的复杂性&#xff0c;实现了一键接入的便捷性。 PLC物联网…

Git介绍及应用

1.简介 Git是一个分布式版本控制器&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; 本地仓库:开发人员自己电脑上的Git仓库远程仓库:远程服务器上的Git仓库 2.执行流程 3.Git代码托管服务…

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…

计算机组成结构—IO接口(IO控制器)

目录 一、I/O 接口的功能 二、I/O 接口的基本结构 1. 总线连接的数据通路 2. I/O 接口的基本组成 三、I/O 端口及其编址 1. 统一编址 2. 不统一编址 四、I/O 接口的类型 两个系统或两个部件之间的交接部分&#xff0c;一般就称为 接口。接口可以是硬件上两种设备间的连…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:医疗健康智能服务

作为国产运动医学的领导者&#xff0c;致力于提供运动医学的整体临床解决方案&#xff0c;公司坐落于北京经济技术开发区。应用于肩关节、膝关节、足/踝关节、髋关节、肘关节、手/腕关节的运动医学设备、植入物和手术器械共计300多个品规通过NMPA的批准&#xff0c;临床应用于国…

docker构建java项目镜像

资料参考 参考自黑马教程&#xff1a;10.Docker基础-自定义镜像_哔哩哔哩_bilibili 初步准备 打包好java项目jar包&#xff0c;和Dockerfile文件一起放到指定目录下&#xff0c;后续操作都是在该目录下操作&#xff0c; 我这边是&#xff1a;/usr/local/src/train-ticket/ …

React -- memo允许你的组件在 props 没有改变的情况下跳过重新渲染。

memo(Component, arePropsEqual?) 使用 memo 将组件包装起来&#xff0c;以获得该组件的一个 记忆化 版本。通常情况下&#xff0c;只要该组件的 props 没有改变&#xff0c;这个记忆化版本就不会在其父组件重新渲染时重新渲染。但 React 仍可能会重新渲染它&#xff1a;记忆化…

vue3路由详解,从0开始手动配置路由(vite,vue-router)

创建一个不含路由的vue项目 &#xff08;查看路由配置可以直接跳过这一段&#xff09; 输入npm指令&#xff0c;然后写一个项目名称&#xff0c;之后一路回车即可 npm create vuelatest 注意这里我们不选引入vue router&#xff0c;成功后可以 查看目录 然后按提示信息输入指…

PLC通过Profinet转Modbus网关与流量计通讯案例

1、案例背景 在工业自动化系统中&#xff0c;PLC(可编程逻辑控制器)与流量计之间的通信是保证以后设备生产数据准确传输和实现控制功能的关键。但是&#xff0c;由于PLC和流量计可能使用不同的通信协议(如Profinet和Modbus)&#xff0c;因此需要一种转换机制来实现它们之间的通…

Telnet发邮件的功能如何实现?有哪些限制?

Telnet发邮件有哪些步骤&#xff1f;使用Telnet发送邮件安全吗&#xff1f; 虽然大多数人使用图形化的电子邮件客户端发送和接收邮件&#xff0c;但了解如何通过Telnet发邮件依然是有益的。AokSend将详细介绍Telnet发邮件的功能如何实现&#xff0c;帮助读者掌握这种基础但有用…

问题:材料题请点击右侧查看材料问题 查看材料 #学习方法#经验分享#学习方法

问题&#xff1a;材料题请点击右侧查看材料问题 查看材料 A.Colleges may reduce their enrollment. B.Top universities become increasingly competitive. C.Universities become selective in student admission. D.Colleges invest less in academy and infrastructure…

模拟超市收银系统

题目 模拟超市收银系统 内容要求&#xff1a;使用文本命令行窗口设计模拟超市收银系统。要求由收银员输入顾客的会员卡卡号&#xff08;若有卡&#xff09;、所购商品的货号等。从文件中取出有关价格信息&#xff0c;再把这些信息返回给收银台。同时把该收银台的销售总量和有…

「动态规划」如何求地下城游戏中,最低初始健康点数是多少?

174. 地下城游戏https://leetcode.cn/problems/dungeon-game/description/ 恶魔们抓住了公主并将她关在了地下城dungeon的右下角。地下城是由m x n个房间组成的二维网格。我们英勇的骑士最初被安置在左上角的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。骑士…

Node.js环境搭建

背景 想接触下node开发, 打算做个node环境 一、安装包获取 我喜欢使用压缩包解压然后配置的方式进行 地址为: Index of /download/release/ ,可按需选择自己的版本,我选择了如下版本 二、解压配置 将压缩包解压只自己想要安装的文件加下,配置环境变量,解压如下所示: …

Polar Web【中等】写shell

Polar Web【中等】写shell Contents Polar Web【中等】写shell思路&探索EXP运行&总结 思路&探索 初看题目&#xff0c;预测需要对站点写入木马&#xff0c;具体操作需要在过程中逐步实现。 打开站点(见下图)&#xff0c;出现 file_put_contents 函数&#xff0c;其…

HarmonyOS开发-鸿蒙UiAbility 组件间跳转

前言 随着春节假期结束各行各业复产复工&#xff0c;一年一度的春招也持续火热起来。最近&#xff0c;有招聘平台发布了《2024年春招市场行情周报&#xff08;第一期&#xff09;》。总体来说今年的就业市场还是人才饱和的状态&#xff0c;竞争会比较激烈。 但是&#xff0c;…

算法学习笔记(7.6)-贪心算法(霍夫曼编码)

目录 1.什么是霍夫曼树 2.霍夫曼树的构造过程 3.霍夫曼编码 3.1具体的作用-频率统计 ##实战题目 1.什么是霍夫曼树 给定N个权值作为N个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也…

计算机组成结构—IO方式

目录 一、程序查询方式 1. 程序查询基本流程 2. 接口电路 3. 接口工作过程 二、程序中断方式 1. 程序中断基本流程 2. 接口电路 3. I/O 中断处理过程 三、DMA 方式 1. DMA 的概念和特点 2. DMA 与 CPU 的访存冲突 3. DMA 接口的功能 4. DMA 接口的组成 5. DMA 的…

STCunio数字电源带PID数字闭环(带详细的代码说明文档)

STCunio&#xff0c;即 system on chip unusual i/o,采用类似 arduino 构架设计&#xff0c;即使没有单片机知 识的设计师和艺术家们能够很快地通过它学习电子和传感器的基础知识&#xff0c;并应用到他们的设 计当中。设计中所要表现的想法和创意才是最主要的&#xff0c;至于…