哈希

哈希表(Hash Table)是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。解决哈希相关的算法题通常涉及以下几个方面:

  1. 哈希映射:使用哈希表来映射键和值,常用于需要快速访问数据的场景。
  2. 去重:利用哈希表存储已经出现过的元素,以实现快速去重。
  3. 计数:使用哈希表来统计元素出现的次数。
  4. 分组:将数据分组,组内数据具有相同的特征(如字母异位词分组)。
  5. 查找匹配:利用哈希表快速查找是否存在匹配的元素或者模式。

解题步骤通常包括:

  • 确定哈希表的键(Key)和值(Value)应该是什么。
  • 设计合适的哈希函数,以减少哈希碰撞。
  • 根据题目要求实现哈希表的插入、删除、查找等操作。

下面是一些使用 Go 语言实现的哈希表相关的代码示例:

例 1:找到数组中第一个唯一的字符

func firstUniqChar(s string) int {
    hash := make(map[rune]int)
    for _, c := range s {
        hash[c]++
    }
    for i, c := range s {
        if hash[c] == 1 {
            return i
        }
    }
    return -1
}

例 2:两数之和

func twoSum(nums []int, target int) []int {
    hash := make(map[int]int)
    for i, num := range nums {
        if j, ok := hash[target-num]; ok {
            return []int{j, i}
        }
        hash[num] = i
    }
    return nil
}

例 3:字母异位词分组

func groupAnagrams(strs []string) [][]string {
    hash := make(map[[26]int][]string)
    for _, str := range strs {
        count := [26]int{}
        for _, c := range str {
            count[c-'a']++
        }
        hash[count] = append(hash[count], str)
    }

    result := make([][]string, 0, len(hash))
    for _, group := range hash {
        result = append(result, group)
    }
    return result
}

在解决哈希表相关的算法题时,重要的是理解如何利用哈希表的特性来优化数据的存储和访问。Go 语言的map类型提供了内建的哈希表实现,可以非常方便地用于解决这类问题。