哈希表 - 两个数之和

51 阅读1分钟

哈希表 - 两个数之和

这里我们以力扣1题为例,讲讲如何求解两数之和。

image.png 根据卡哥的讲解,直接使用map就行,需要注意的是map的键值对存储的是什么值。

image.png 上图就是map的结构,键存储数组中的每一个元素,值存储数组元素的下标。

在聊map的解题思路之前,我们先用用暴力破解法

// 暴力解法
func twoSum(nums []int, target int) []int {
    for i := 0; i < len(nums); i++ {
        for j := 1; j < len(nums); j++ {
            if nums[i]+nums[j] == target && i != j {
                return []int{i, j}
            }
        }
    }
    return nil
}

相信这种方式大家可以很容易理解。下面就讲map的解法。

  1. 只找两个数的和等于target
  2. a + b = target => b = target - b

上面这个等式大家应该能理解,重点就是这个等式

func twoSum(nums []int, target int) []int {
    m := make(map[int]int)
    for index, num := range nums {
        if value, ok := m[target-num]; ok {
            return []int{value, index} // value是之前的元素下标,index是当前元素的下标
        }else{
            m[num] = index
        }
    }
    return nil
}

image.png 以上图为例,target = 9

  1. 元素2进来,查map,不存在元素target-2=7。将元素2及其下标0存入map
  2. 元素7进来,查map,存在元素target-7=2。直接返回元素2和元素7的下标
  3. 如此循环下去,循环体中一直不返回结果,最后返回nil