哈希表专项训练1

有效字母异位

https://leetcode.cn/problems/valid-anagram/description/

代码

func isAnagram(s string, t string) bool {
    record := [26]int{0}
    for _, v := range s {
        record[v-'a']++
    }
    for _, v := range t {
        record[v-'a']--
    }
    for _, v := range record {
        if v!=0 {
            return false
        }
    }
    return true
}

思路

创建26字母哈希表,若字母异位,则最后哈希表元素全为0。
关键:1.打表 2.抵消:利用数组存字符个数解决多对象进行比较重合的问题

两数组交集

https://leetcode.cn/problems/intersection-of-two-arrays/description/

代码

func intersection(nums1 []int, nums2 []int) []int {
    set := make(map[int]struct{},0)
    res := make([]int,0)

    for _,v := range nums1{
        set[v]=struct{}{}
    }
    for _,v := range nums2 {
        if _,ok := set[v];ok{
            res=append(res,v)
            delete(set,v)
        }
    }
    return res
}

思路

通过hashset进行查重,如果该元素存在则存在结果集。
关键:1.打表2.set去重

两数组交集Ⅱ

代码

func intersect(nums1 []int, nums2 []int) []int {
    m := make(map[int]int,0)
    for _,v := range nums1 {
        m[v]++
    }
    res := []int{}
    for _,v := range nums2 {
        if m[v]>0 {
            res=append(res,v)
        }
        m[v]--
    }
    return res
}

思路

利用hashmap进行去重,如果该元素存在则留下。
与上题不同的是,需要将出现在两数组中最少次数的元素也加入结果集(即使该元素出现次数>=2)。
key:元素
value:元素出现的次数
出现一次-1,并加入结果集,直到为0,抵消完成。
关键:1.打表2.抵消

两数之和

https://leetcode.cn/problems/two-sum/description/

代码

func twoSum(nums []int, target int) []int {

    m := make(map[int]int,0)
    var n int
    for i1, v1 := range nums {
        n=target-v1
        if _, ok := m[n];ok {
            return []int{i1, m[n]}
        } else {
            m[v1]=i1
        }
    }
    return []int{}
}

思路

利用map,key存数组元素,value存元素下标。
枚举数组,然后用map查找已遍历过的元素中是否有目标值,若枚举结束没有找到目标值,则说明不存在。
正常暴力需要双forO(n^2),此方法哈希查找O(n)。
关键:1.map的key-value结构 2.哈希查找已遍历的元素(该元素可能与未遍历的元素有关联)。

四数相加

https://leetcode.cn/problems/4sum-ii/description/

代码

func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {
    m := make(map[int]int, 0)

    for _,v1 := range nums1 {
        for _, v2 := range nums2 {
            m[v1+v2]++
        }
    }
    var count int = 0
    for _, v3 := range nums3 {
        for _, v4 :=range nums4 {
            count += m[-v3-v4]
        }
    }
    return count
}

思路

四个数组,实际上就是两个数组。
两两相加,然后抵消。
关键:1."抵消"变通->匹配:通过打表匹配求组合数思路

赎金信

https://leetcode.cn/problems/ransom-note/

代码

func canConstruct(ransomNote string, magazine string) bool {
    a := [26]int{}
    for _, v := range magazine {
        a[v-'a']++
    }

    for _, v := range ransomNote {
        a[v-'a']--
        if a[v-'a']<0{
            return false
        }
    }
    return true
}

思路

比较多个对象的重合问题,打表抵消即可。
关键:1.抵消

总结

  • 出现最多的关键字:抵消去重
  • 新发现:打表匹配求组合数
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值