本文主要总结通过hash解决算法相关的题目。主要是利用map查找速度快的优点通过空间换时间提升查询效率,通常我们认为是O(1)的时间复杂度。对于某些要提升查询速度的性能优化可以考虑使用。
242. 有效的字母异位词
解题思路:
英文字母共计有26个,我们可以定义一个26个字母的字典表。第一个集合出现的字母进行+1。第二个集合出现的字母-1
这样最后对字典表进行统计,如果两个字符集合是异位词字典表各个位置都应该等于0,如果不等于0代表不是异位词
func isAnagram(s string, t string) bool {
c := [26]int{}
for i := range s {
c[s[i] - 'a']++
}
for i := range t {
c[t[i] - 'a']--
}
for i := range c {
if c[i] != 0 {
return false
}
}
return true
}
454. 四数相加 II
解题思路:
暴力求解:
求解公式:
a + b + c + d = 0
这道题暴力求解就是对每层集合做循环共四层for循环,一个一个的去试。
hash法求解:
我们对公式做变换:
a + b = -c - d
只需要让不等式两边相等即可,那么我们可以对任意两个集合先求和,然后再对两位两个集合相减
func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {
m := map[int]int{}
res := 0
for i := range nums1 {
for j := range nums2 {
m[nums1[i]+nums2[j]]++
}
}
for i := range nums3 {
for j := range nums4 {
res += m[-nums3[i]-nums4[j]]
}
}
return res
}