LeetCode75学习计划-哈希表/哈希集合

算法解题思路很多会借鉴于题解区,如果侵权请联系删除。

本章节知识点为哈希表/哈希集合

找出两数组的不同

题目标签:

  • 数组
  • 哈希表

题目难度: Easy

题目描述:

给你两个下标从 0 开始的整数数组 nums1nums2 ,请你返回一个长度为 2 的列表 answer ,其中:

answer[0]nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。
answer[1]nums2 中所有 不 存在于 nums1 中的 不同 整数组成的列表。
注意:列表中的整数可以按 任意 顺序返回。

解题思路:

  • 通过集合来存储每个数组的数据映射,然后比对即可

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func findDifference(nums1, nums2 []int) [][]int {
// 两个集合来存储两个数组中的元素
set1 := map[int]bool{}
set2 := map[int]bool{}
for _, v := range nums1 {
set1[v] = true
}
for _, v := range nums2 {
set2[v] = true
}
// 结果数组
ans1 := make([]int, 0)
ans2 := make([]int, 0)
for v := range set1 {
if !set2[v] {
ans1 = append(ans1, v)
}
}
for v := range set2 {
if !set1[v] {
ans2 = append(ans2, v)
}
}
return [][]int{ans1, ans2}
}

独一无二的出现次数

题目标签:

  • 数组
  • 哈希表

题目难度: Easy

题目描述:

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。

如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false

解题思路:

  • 可以先统计每个数字出现的次数,最后比对次数是否有重复即可

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func uniqueOccurrences(arr []int) bool {
// 存储数据映射
hash := map[int]int{}
// 存储每个数字出现的次数
for _, v := range arr {
hash[v] ++
}
// 存储出现次数的映射
set := map[int]bool{}
for _, v := range hash {
if set[v] {
return false
}
set[v] = true
}
return true
}

确定两个字符串是否亲近

题目标签:

  • 字符串
  • 哈希表
  • 排序

题目难度:Medium

题目描述:

如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :

操作 1:交换任意两个 现有 字符。
例如,abcde -> aecdb
操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。
例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a
你可以根据需要对任意一个字符串多次使用这两种操作。

给你两个字符串,word1word2 。如果 word1word2 接近 ,就返回 true ;否则,返回 false

解题思路:

  • 满足要求的字符必须满足几个条件
  • 两个字符串的长度相同
  • 两个字符串里的字母的种类相同
  • 两个字符串的字母数量对应,不要求字母一样,但必须是对应的,比如word13个a,2个b,1个c, 而word23个c,2个a,1个b,不要求字母一致,但是数量要能对应起来

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
func closeStrings(word1 string, word2 string) bool {
// 判断长度是否一致
if len(word1) != len(word2){
return false
}
// 字符统计
hash1 := make(map[rune]int)
hash2 := make(map[rune]int)
for _ , v1 := range word1{
hash1[v1] ++
}
for _ , v2 := range word2{
hash2[v2] ++
}
if len(hash1) != len(hash2){
return false
}
// 判断字符种类是否相同
for k , _ := range hash1{
if _ , ok := hash2[k] ; !ok {
return false
}
}
// 比对数量是否能对应,找到对应的则置为0
for key , _ := range hash1{
for key2 , _ := range hash2{
if hash1[key] == hash2[key2]{
hash2[key2] = 0
break
}
}
}
// 有不为0的则表示数量是不能对应的
for _ , v :=range hash2{
if v != 0{
return false
}
}
return true
}

相等行列对

题目标签:

  • 数组
  • 哈希表
  • 矩阵

题目难度:Medium

题目描述:

给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。

如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。

解题思路:

  • 通过哈希表将每一行放入哈希表中统计该行内容出现的次数
  • 然后循环每一列,找到与之相等的行,然后将次数累加即可

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func equalPairs(grid [][]int) int {
// 行/列数
n := len(grid)
// 哈希表存储每一行内容出现的次数
cnt := map[string]int{}
for _, row := range grid {
cnt[fmt.Sprint(row)]++
}
res := 0
for j := 0; j < n; j++ {
// 每一列的内容
var arr []int
for i := 0; i < n; i++ {
arr = append(arr, grid[i][j])
}
// 如果列内容在行中有一样的,统计该行出现的次数
if val, ok := cnt[fmt.Sprint(arr)]; ok {
res += val
}
}
return res
}
作者

胡兆磊

发布于

2023-12-09

更新于

2024-04-03

许可协议