【代码随想录——哈希表】

1.哈希表理论基础

首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。
在这里插入图片描述
那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。

哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

2. 有效的字母异位词

在这里插入图片描述

// 判断字符串 t 是否是字符串 s 的字母异位词
func isAnagram(s string, t string) bool {charCount := make(map[rune]int,0)// 若字符串长度不同,直接返回 falseif len(s) != len(t) {return false}// 将字符串转换为字符数组,并对字符数组进行排序sChars := []rune(s)tChars := []rune(t)for i:=0;i<len(sChars);i++{if _,ok:=charCount[sChars[i]];ok{charCount[sChars[i]]++}else{charCount[sChars[i]]=1}}for i:=0;i<len(tChars);i++{char,ok := charCount[tChars[i]]if !ok || char==0{return false}charCount[tChars[i]]--}return true
}

这是官方的一种更简洁的写法:

func isAnagram(s string, t string) bool {if len(s)!=len(t){return false}s_map:=[26]int{}t_map:=[26]int{}for i:=0;i<len(s);i++{s_map[s[i]-'a']++t_map[t[i]-'a']++}return s_map==t_map
}

2.1 字母异位词分组

在这里插入图片描述

2.1.1 第一次的写法,有点慢

func groupAnagrams(strs []string) [][]string {map_style := make([][26]int, 0)str_list := make([][]string, 0)map_index := 0for _, str := range strs {strMap := changeStrToMap(str)index := findCorrectStyle(strMap, map_style, map_index)if index == -1 {//表明这是一个新的stylemap_style = append(map_style, strMap)temp := []string{str}str_list = append(str_list, temp)map_index++} else {str_list[index] = append(str_list[index], str)}}return str_list[0:map_index]
}func changeStrToMap(s string) [26]int {s_map := [26]int{}for i := 0; i < len(s); i++ {s_map[s[i]-'a']++}return s_map
}func findCorrectStyle(strMap [26]int, map_style [][26]int, map_index int) int {for i := 0; i < map_index; i++ {if strMap == map_style[i] {return i}}return -1
}

2.1.2 学习一下高手的写法

确实快,主体思路没什么问题,就是不知道数组也能当做map的key。

func groupAnagrams(strs []string) [][]string {// 没想到数组也可以当做keyhmap := make(map[[26]int][]string)for _, str := range strs {// key 表示str 的字符最多26个,每个字符有多少个key := [26]int{}// 计数for _, ch := range str {// idx 代表字符距离小写字母的距离, b 的话是1idx := ch - 'a'key[idx] ++}hmap[key] = append(hmap[key], str)}result := make([][]string, 0, len(hmap))for _, v := range hmap {result = append(result, v)}   return result
}

2.2 找到字符串中所有字母异位词

在这里插入图片描述

func findAnagrams(s string, p string) []int {res := make([]int, 0)if len(s) < len(p) {return res}// 用来存储p中各个小写字母出现的次数pattern := [26]int{}temp := [26]int{}for i := 0; i < len(p); i++ {pattern[p[i]-'a']++temp[s[i]-'a']++}if pattern == temp {res = append(res, 0)}for i := 0; i < len(s)-len(p); i++ {temp[s[i]-'a']--temp[s[i+len(p)]-'a']++if pattern == temp {res = append(res, i+1)}}return res
}

3. 两个数组的交集

在这里插入图片描述

func intersection(nums1 []int, nums2 []int) []int {mp := make(map[int]struct{},0)res := make([]int,0)// 遍历nums1for _,num := range(nums1){mp[num] = struct{}{}}// 遍历nums2for _,num := range(nums2){_,ok := mp[num]if ok{// 查找到相同元素,加入答案。并从mp中删除res = append(res,num)delete(mp,num)}}return res
}

3.1 两个数组的交集②

在这里插入图片描述
和上面的代码只有一点点区别,区别在于这道题目需要记录元素出现的个数。

func intersect(nums1 []int, nums2 []int) []int {mp := make(map[int]int,0)res := make([]int,0)// 遍历nums1for _,num := range(nums1){_,ok := mp[num]if !ok{mp[num]=1}else{mp[num]++}}// 遍历nums2for _,num := range(nums2){_,ok := mp[num]if ok{// 查找到相同元素,加入答案。并从mp中删除res = append(res,num)mp[num]--if mp[num]==0{delete(mp,num)}}}return res
}

4.快乐数

在这里插入图片描述

func isHappy(n int) bool {mp := make(map[int]struct{},0)for n != 1{_,ok := mp[n]if ok {//这个数见过return false}//没见过,就记录一下mp[n] = struct{}{}n = getSum(n)}return true
}func getSum(n int)int{res := 0for n>0{res = res + (n%10)*(n%10)n = n/10}return res
}

5. 两数之和

在这里插入图片描述

func twoSum(nums []int, target int) []int {m:=make(map[int]int)for i,n:= range nums {j,ok:= m[target-n]if ok {return []int{i,j}}m[n]=i}return []int{}
}

6. 四数相加②

在这里插入图片描述
思路:两两组合

func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {res := 0mp := make(map[int]int,len(nums1)*len(nums1))//循环遍历nums1和nums2两个数组for i:=0;i<len(nums1);i++{for j:=0;j<len(nums2);j++{num := nums1[i] + nums2[j]if _,ok := mp[num];ok{mp[num]++}else{mp[num]=1}}}//循环遍历nums3和nums4两个数组for i:=0;i<len(nums3);i++{for j:=0;j<len(nums4);j++{num := nums3[i] + nums4[j]if _,ok := mp[-num];ok{res += mp[-num]}}}return res
}

7.赎金信

在这里插入图片描述

func canConstruct(ransomNote string, magazine string) bool {pattern1 := [26]int{}for i:=0;i<len(magazine);i++{pattern1[magazine[i]-'a']++}for i:=0;i<len(ransomNote);i++{pattern1[ransomNote[i]-'a']--if pattern1[ransomNote[i]-'a']<0{return false}}return true
}

8.三数之和

在这里插入图片描述
方法一:哈希表

这题不太适合使用hash来做

方法二:双指针,需要先排序。感觉不够快

func threeSum(nums []int) [][]int {var result [][]intif nums == nil || len(nums) < 3 {return result}slices.Sort(nums)for i := 0; i < len(nums); i++ {if nums[i] > 0 {return result}if i > 0 && nums[i] == nums[i-1] {continue}L := i + 1R := len(nums) - 1for L < R {if nums[i]+nums[L]+nums[R] == 0 {sub := []int{nums[i], nums[L], nums[R]}result = append(result, sub)for L < R && nums[L] == nums[L+1] {L += 1}for L < R && nums[R] == nums[R-1] {R -= 1}L += 1R -= 1}else if nums[i]+nums[L]+nums[R] > 0 {R -= 1} else {L += 1}}}return result
}

9.四数之和

在这里插入图片描述

9.1 利用map的写法

我的方法无法通过测试用例,会超时
在这里插入图片描述

func fourSum(nums []int, target int) [][]int {res := make(map[[4]int]struct{}, 0)mp := make(map[int][]int, 0)for i := 0; i < len(nums); i++ {for j := i + 1; j < len(nums); j++ {temp := nums[i] + nums[j]arr, ok := mp[temp]if !ok {slice := make([]int, 2)slice[0] = islice[1] = jmp[temp] = slice} else {//已有arr = append(arr, i)arr = append(arr, j)mp[temp] = arr}}}for key, arr1 := range mp {toFind := target - keyarr2, ok := mp[toFind]if !ok {continue}for i := 0; i < len(arr1)/2; i++ {for j := 0; j < len(arr2)/2; j++ {index_a, index_b := arr1[i*2], arr1[i*2+1]index_c, index_d := arr2[j*2], arr2[j*2+1]if index_a == index_c || index_a == index_d || index_b == index_c || index_b == index_d {continue}item := []int{nums[index_a], nums[index_b], nums[index_c], nums[index_d]}sort.Ints(item)res[[4]int{item[0], item[1], item[2], item[3]}] = struct{}{}}}}back := [][]int{}for key, _ := range res {back = append(back, key[:])}return back
}

9.2 使用双指针的解法

两层for循环,套用一个左右指针。可以通过剪枝提高算法的运行速度。

func fourSum(nums []int, target int) [][]int {if len(nums) < 4 {return nil}sort.Ints(nums)var res [][]intfor i := 0; i < len(nums)-3; i++ {n1 := nums[i]// if n1 > target { // 不能这样写,因为可能是负数// 	break// }if i > 0 && n1 == nums[i-1] {  // 对nums[i]去重continue}for j := i + 1; j < len(nums)-2; j++ {n2 := nums[j]if j > i+1 && n2 == nums[j-1] {  // 对nums[j]去重continue}l := j + 1r := len(nums) - 1for l < r {n3 := nums[l]n4 := nums[r]sum := n1 + n2 + n3 + n4if sum < target {l++} else if sum > target {r--} else {res = append(res, []int{n1, n2, n3, n4})for l < r && n3 == nums[l+1] { // 去重l++}for l < r && n4 == nums[r-1] { // 去重r--}// 找到答案时,双指针同时靠近r--l++}}}}return res
}

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

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

相关文章

windows安装ElasticSearch以及踩坑

1.下载 elasticsearch地址&#xff1a;Past Releases of Elastic Stack Software | Elastichttps://www.elastic.co/cn/downloads/past-releases#elasticsearch IK分析器地址&#xff1a;infinilabs/analysis-ik: &#x1f68c; The IK Analysis plugin integrates Lucene IK…

【网站项目】戒烟网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【Unity Shader入门精要 第4章】数学基础(二)

1. Unity中的坐标空间 1.1 五个坐标空间 模型空间 模型自身的3D坐标系空间&#xff0c;左手坐标系是一个相对空间&#xff0c;坐标轴指向随模型旋转变化当物体有父节点时&#xff0c;Transform组件中各属性的值表示的即为该物体在其父物体的模型空间中的值当模型顶点传入顶点…

ICDE2024 |VDTuner:向量数据库自动调优技术

在CodeFuse接入实际业务的过程中&#xff0c;大模型的推理成本以及生成内容的准确性是产品规模落地的两个核心考量因素。为了降低推理成本&#xff0c;我们研发了CodeFuse-ModelCache语义缓存加速功能&#xff0c;通过引入Cache机制&#xff0c;缓存已经计算的结果&#xff0c;…

OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

antdVue 自定义table列配置

最近做项目的时候需要对页面的table进行列配置的需求 子组件 <div><a-modaltitle"列配置" :visible"visible" :closable"false" :footer"null"width"800px" height"448px"><div><a-row>…

【完美解决】使用git时候出现error setting certificate verify locations: CAfile:问题

1、出现场景&#xff1a; 在使用idea的时候&#xff0c;进行git下的push&#xff0c;出现下面的错误&#xff1a; 2、原因分析&#xff1a; 可能因为重装过系统&#xff0c;或者是安装git的位置发生了变化等情况出现。 3、解决方案&#xff1a; 找到git的安装路径&#xf…

Java中Maven的依赖管理

依赖介绍 是指当前项目运行所需要的jar包&#xff0c;一个项目中可以引入多个依赖 配置 在pom.xml中编写<dependencies>标签 在<dependencies>中使用<dependency>引入标签 定义坐标的groupId、rtifactId、version 点击刷新按钮、引入新坐标 例如引入下…

运维实施工程师之Linux服务器全套教程

一、Linux目录结构 1.1 基本介绍 Linux 的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 在 Linux 世界里&#xff0c;一切皆文件&#xff08;即使是一个硬件设备&#xff0c;也是使用文本来标…

Android(一)

坏境 java版本 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 进入安卓官网下载 勾选协议 next 如果本地有设置文件&#xff0c;选择Config or installation folder 如果本地没有设置文件&#xff0c;选择Do not import settings 同意两个协议 耐…

接入大量设备后,视频汇聚系统EasyCVR安防监控视频融合平台是如何实现负载均衡的?

一、负载均衡 随着技术的不断进步和监控需求的日益增长&#xff0c;企业视频监控系统的规模也在不断扩大&#xff0c;接入大量监控设备已成为一项常态化的挑战。为确保企业能够有效应对这一挑战&#xff0c;视频汇聚系统EasyCVR视频融合平台凭借其卓越的高并发处理能力&#x…

Pandas入门篇(三)-------数据可视化篇3(seaborn篇)(pandas完结撒花!!!)

目录 概述一、语法二、常用单变量绘图1. 直方图&#xff08;histplot&#xff09;2. 核密度预估图&#xff08;kdeplot&#xff09;3. 计数柱状图&#xff08;countplot&#xff09; 三、常用多变量绘图1.散点图(1) scatterplot(2)regplot 散点图拟合回归线(3)jointplot 散点图…

2024年Q1脱毛膏线上市场(京东天猫淘宝)销量销额排行榜

鲸参谋监测的2024年Q1季度线上电商平台&#xff08;天猫淘宝京东&#xff09;脱毛膏行业销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年Q1季度在线上电商平台&#xff08;天猫淘宝京东&#xff09;&#xff0c;脱毛膏的销量累计接近220万件&#xff0c;环比增…

开源代码分享(28)-含分布式光伏的配电网集群划分和集群电压协调控制

参考文献&#xff1a; [1] Chai Y , Guo L , Wang C ,et al.Network Partition and Voltage Coordination Control for Distribution Networks With High Penetration of Distributed PV Units[J].IEEE Transactions on Power Systems, 2018:3396-3407.DOI:10.1109/TPWRS.2018…

OFDM802.11a的FPGA实现(九)星座图映射(含verilog和matlab代码)

目录 1. 前言2. 调制2.1 QAM调制2.2 64-QAM 调制2.3 16-QAM 调制 3.模块实现4.Matlab仿真5.ModelSim仿真6.verilog代码 原文连接&#xff08;相关文章合集&#xff09;&#xff1a; OFDM 802.11a的xilinx FPGA实现 1. 前言 在上一篇博客当中&#xff0c;已经完成了数据域的交织…

计算机毕设

随着社会和国家的重视&#xff0c;大学对于大学生毕业设计越来越重视。 做软件设计设计方面&#xff0c;前后端分离是必不可少的&#xff0c;代码管理工具&#xff0c;前后端接口测试是项目中必须要用到的工具。做大数据设计方面&#xff0c;主要是要用到爬虫进行数据爬取&…

Unity初级---初识生命周期

1. Awake() &#xff1a;唤醒函数&#xff0c;最先执行的函数&#xff0c;只执行一次&#xff0c;当脚本文件挂载的对象被激活时调用 2. OnEnable() &#xff0c;OnDisable()&#xff1a;当脚本启用和禁用时触发&#xff0c;可执行多次&#xff0c;触发的前提是脚本挂载的对象…

奥威-金蝶BI现金流量表模板,可借鉴、可套用

企业现金流一旦出了问题都是大问题&#xff0c;会直接影响到企业的日常运作&#xff0c;甚至直接关系到企业能不能继续存活&#xff0c;因此现金流量表是企业财务分析中重要报表之一&#xff0c;也是企业监控财务监控情况的重要手段之一。那么这么重要的一份现金流量表该怎么做…

大模型模型简化机器人训练;简单易用的 3D 工具Project Neo;特斯拉放出了擎天柱机器人最新训练视频

✨ 1: DrEureka 利用大语言模型自动化将机器人仿真环境训练结果转移到真实世界 DrEureka是一种利用大型语言模型&#xff08;LLMs&#xff09;自动化和加速从仿真&#xff08;sim&#xff09;到现实世界&#xff08;real&#xff09;转移的技术。在机器人技能学习领域&#x…

线程池(一)

1.线程池的基本概念 1.1 什么是线程池&#xff1a; 线程池是一种利用池化技术思想来实现的线程管理技术&#xff0c;主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的…