哈希表
242.有效的字母异位词
看完题目的第一想法
本题最直接的做法就是两层for循环,暴力解题,时间复杂度O(\(n^2\))。
因为题目只包含小写字母,那么可以通过一个大小为26的数组来解决。
- 数组的每一位存储一个小写字母,先遍历
s
每出现一个单词就令数组对应位置加1 - 再遍历
t
每出现一个单词就令数组对应位置减一 - 最后遍历数组,如果是异位词数组中的所有数字都应该是0,反之则不是。
func isAnagram(s string, t string) bool {
m := [26]int{}
for _, ss := range s {
m[ss-'a']++
}
for _, tt := range t {
m[tt-'a']--
}
for _, v := range m {
if v != 0 {
return false
}
}
return true
}
本题收获
简单题, 看到题目就想到了使用哈希表来求解。
349. 两个数组的交集
看完题目的第一想法
简单题重拳出击
本题是求2个数组的交集,即nums1中存在的元素nums2中也存在,可以使用哈希表的方式来解决。因为本题没有限制题目的数值大小,因此无法像题目242一样使用数组代替哈希表。
注意输出结果需要数值唯一,可以使用键值分别为int
和bool
作为哈希表的键值对;
func intersection(nums1 []int, nums2 []int) []int {
m := make(map[int]bool)
rlt := []int{}
for _, num := range nums1 {
m[num] = true
}
for _, num := range nums2 {
if v, ok := m[num]; ok && v {
m[num] = false // 遍历过了这个数值,因此标记成false
rlt = append(rlt, num)
}
}
return rlt
}
本题收获
一道比较简单的使用哈希表解决的问题,需要注意的是对输出结果数值唯一的处理
202.快乐数
看完题目的第一想法
本题的解法在题目的描述中已经告诉了,需要考虑的是:
- 当求出的和是以前出现过的计算结果的时候就退出循环。
- 求一个数每个位上和的办法。
func isHappy(n int) bool {
var getSum func(int) int
getSum = func(num int) (sum int) {
for num > 0 {
sum += (num % 10) * (num % 10)
num /= 10
}
return
}
m := make(map[int]struct{})
for {
rlt := getSum(n)
if rlt == 1 {
return true
}
if _, ok := m[rlt]; ok {
return false
}
m[rlt] = struct{}{}
n = rlt
}
}
本题收获
- 注意循环退出的条件是出现了重复数字,使用哈希表来存储计算过的数字
- 计算一个数各个位上的和
1.两数之和
看完题目的第一想法
求两个数之和,很明显可以使用暴力解法两层for循环,时间复杂度O(\(n^2\))。
本题是求数组中哪2个数的和为target
- 使用哈希表记录已经遍历过的数值,key为数值,value为数组下标
- 每次遍历的时候记当前的值为v,下标为i,可以到哈希表中匹配
target-v
是否存在 - 如果存在,哈希表中的value值和当前值的下标i为答案
- 如果不存在,就将当前的值v与下标i记录到哈希表中
func twoSum(nums []int, target int) []int {
m := make(map[int]int)
for i, v := range nums {
if vv, ok := m[target-v]; ok {
return []int{vv, i}
}
m[v] = i
}
return nil
}
本题收获
算法中经常会使用到空间换时间的方式来降低时间复杂度
标签:数组,int,算法,num,哈希,rlt,第五天,本题 From: https://www.cnblogs.com/neilliu/p/16732630.html