今日题目:
242. 有效的字母异位词
349. 两个数组的交集
202. 快乐数
1. 两数之和
242. 有效的字母异位词
要点:
1. 使用哈希即可
2. 也能使用排序解决
这里比较巧妙的是使用特别的判定方式节约了空间。
代码:
func isAnagram(s string, t string) bool {
if len(s) != len(t) {
return false
}
cnt := map[rune]int{}
for _, ch := range s{
cnt[ch]++
}
for _, ch := range t{
cnt[ch]--
if cnt[ch]<0 {
return false
}
}
return true
}
349. 两个数组的交集
要点:
1.看到集合大概率就是哈希
2. 学习下如何在Go中使用struct进行hash
这题主要就是学习在Golang中如何写哈希。对于只需要知道元素是否存在而无需关心其值是多少的情况时可以使用struct来节约内存空间。
代码:
func intersection(nums1 []int, nums2 []int) []int {
set:=make(map[int]struct{},0)
res:=make([]int,0)
for _,v:=range nums1{
if _,ok:=set[v];!ok{
set[v]=struct{}{}
}
}
for _,v:=range nums2{
//如果存在于上一个数组中,则加入结果集,并清空该set值
if _,ok:=set[v];ok{
res=append(res,v)
delete(set, v)
}
}
return res
}
202. 快乐数
要点:
1. 看到出现循环或者需要判断元素是否出现过时可以使用hash来记录
2. 可以采用数学找规律
好题目。哈希题目的一大难点是知道可以用哈希。这题目想到了使用哈希就好说了。另外官解中for的写法可以学习一下。
代码:
func isHappy(n int) bool {
m := map[int]bool {}
for ; n != 1 && !m[n]; n, m[n] = step(n), true{}
return n == 1
}
func step(n int) int {
sum := 0
for n>0 {
sum +=(n%10) * (n%10)
n = n/10
}
return sum
}
1. 两数之和
要点:
1. 学会使用哈希节省时间。
Leetcode第一题,还是挺有含金量的。第一眼都能想到n方的暴力解法,使用hash处理还是挺巧妙的。
代码:
func twoSum(nums []int, target int) []int {
set := map[int]int{}
for i, x := range nums {
if p, ok := set[target-x]; ok {
return []int{p, i}
}
set[x] = i
}
return nil
}
总的来说这次哈希的题目都不算难,主要是要有使用哈希的意识。当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。