[leetcode 哈希表] 模版

- 日理万妓 2024-02-05 11:29 152阅读 0赞

文章目录

    • 1.有效字母的异位词 E
      1. 两个数组的交集 E
    • 3.快乐数 E
      1. 两数之和 E
      1. **topk(前k个高频元素) M**

1.有效字母的异位词 E

:::details

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:

输入: s = “rat”, t = “car”
输出: false

提示:

1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-anagram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. func isAnagram(s string, t string) bool {
  2. if len(s) != len(t) {
  3. return false
  4. }
  5. n := len(s)
  6. hashMap := make(map[byte]int)
  7. for i:=0; i<n; i++ {
  8. v := s[i]
  9. if n,ok := hashMap[v]; ok {
  10. hashMap[v] = n + 1
  11. } else {
  12. hashMap[v] = 1
  13. }
  14. }
  15. for i:=0; i<n; i++ {
  16. v := t[i]
  17. if n,ok := hashMap[v]; n > 0 && ok {
  18. hashMap[v] = n - 1
  19. } else {
  20. return false
  21. }
  22. }
  23. return true
  24. }

:::

2. 两个数组的交集 E

:::details

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
通过次数295,087提交次数398,258

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 直接hash

    func intersection(nums1 []int, nums2 []int) []int {

    1. hash := make(map[int]int)
    2. res := make([]int,0)
    3. for _, v := range nums1 {
    4. if _,ok := hash[v]; !ok {
    5. hash[v] = 1
    6. }
    7. }
    8. for _,v := range nums2 {
    9. if _,ok := hash[v]; ok {
    10. delete(hash,v)
    11. res = append(res,v)
    12. }
    13. }
    14. return res

    }

:::

3.快乐数 E

:::details

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
示例 2:

输入:n = 2
输出:false

提示:

1 <= n <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/happy-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. var (
  2. ONE = 1
  3. )
  4. func isHappy(n int) bool {
  5. hash := make(map[int]struct{
  6. })
  7. for {
  8. sum := getSum(n)
  9. if sum == ONE {
  10. return true
  11. }
  12. if _,ok := hash[sum]; ok {
  13. return false
  14. } else {
  15. hash[sum] = struct{
  16. }{
  17. }
  18. }
  19. n = sum
  20. }
  21. }
  22. func getSum(n int) int {
  23. sum := 0
  24. for n > 0 {
  25. sum += (n%10)*(n%10)
  26. n /= 10
  27. }
  28. return sum
  29. }

:::

4. 两数之和 E

:::details

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. func twoSum(nums []int, target int) []int {
  2. n := len(nums)
  3. ans := make([]int,0,2)
  4. need := make(map[int]int)
  5. var reg int
  6. for i:=0; i<n; i++ {
  7. reg = nums[i]
  8. if val,ok := need[reg]; ok {
  9. ans = append(ans,val, i)
  10. break
  11. } else {
  12. need[target-reg] = i
  13. }
  14. }
  15. return ans
  16. }

:::

5. topk(前k个高频元素) M

:::details

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]

提示:
1 <= nums.length <= 105
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/top-k-frequent-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. func topKFrequent(nums []int, k int) []int {
  2. sort.Ints(nums)
  3. res := make([]int, 0)
  4. hash := make(map[int]int)
  5. for i, l := 0, len(nums); i < l; i++ {
  6. cnt, num := 1, nums[i]
  7. for i+1 < l && nums[i+1] == num {
  8. cnt++
  9. i++
  10. }
  11. hash[num] = cnt
  12. if len(res) < k {
  13. res = append(res, num)
  14. } else {
  15. // 寻找最小的元素
  16. minIndex := 0
  17. for j := 1; j < k; j++ {
  18. if hash[res[j]] < hash[res[minIndex]] {
  19. minIndex = j
  20. }
  21. }
  22. if hash[res[minIndex]] < cnt {
  23. res[minIndex] = num
  24. }
  25. }
  26. }
  27. return res
  28. }

:::

发表评论

表情:
评论列表 (有 0 条评论,152人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    什么是哈希表    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的[数据结构][Link 1]。也就是说,它通过把关键码

    相关

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速

    相关

    我们知道,通过对数组进行直接寻址(Direct Addressing),可以在 O(1) 时间内访问数组中的任意元素。所以,如果存储空间允许,可以提供一个数组,为每个可能的关键

    相关

    一、简介 如果所有的键都是小整数,那么我们可以用一个数组来实现无序的符号表,将键作为数组的索引i而数组中i(键)处储存的就是对应的值。 这样就可以快速地访问任意键的值,

    相关

    【一】哈希表 > 他通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数就是散列函数。 ![watermark_type_ZmFuZ3poZW5na