hash法解题

本文主要总结通过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
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值