哈希表 - 两个数之和
这里我们以力扣1题为例,讲讲如何求解两数之和。
根据卡哥的讲解,直接使用
map就行,需要注意的是map的键值对存储的是什么值。
上图就是
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的解法。
- 只找两个数的和等于target
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
}
以上图为例,
target = 9
- 元素2进来,查
map,不存在元素target-2=7。将元素2及其下标0存入map - 元素7进来,查
map,存在元素target-7=2。直接返回元素2和元素7的下标 - 如此循环下去,循环体中一直不返回结果,最后返回
nil