给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
链接:https://leetcode-cn.com/problems/two-sum
入门求解思路
这道题最直观最容易想到的就是遍历嘛,也就是暴力求解。其实就是搞组合,从O(n^n/2)的组合中找到和为target的那些个组合。
快速解法:
另外的方法就不是那么显而易见了。
我们一步步的想:
要找的两个数都在数组中,假如其中一个是A,那么另外一个数B就是target-A。
(A,target-A)均是数组中元素。
假如我们确定了A,那么另外一个数B(=target-A)其实就已经是确定的了。
假如我们知道了A,我们能够快速确定的是A、A的下标indexA,以及B。那么我们接下来所要做的就是快速找到B所对应的下标即可。
数组,我们知道,如果知道一个数的下标索引index,那么我们只要O(1)时间就立即知道该下标所对应的值List[index],那么反过来就难了。知道数组中某个元素的值,那么我们怎么能快速知道它的下标呢?正常就是遍历,需要O(n)时间,还能怎么做呢?
我们应该想到的是把数组中每个值对应的下标给存起来,这样,每个值对应的下标我们也就立马能知道了。怎么存呢?
这时,就要利用另一种数据结构:字典。字典有很多种称呼,map,dict,..whatever。我们的做法就是,将数组中的每个元素的值作为字典的key,然后将其下标作为value保存到字典中。
最后一步是:假如现在有字典中某个元素key是key1,那么另一个元素target-key1也在字典中,则二者对应的value即为结果。
简单代码(golang vs python)
golang
package main
import (
"fmt"
)
func sumOfNums(numList []int, target int) {
numMap := make(map[int]int)
for index, value := range numList {
numMap[value] = index
}
for key, value := range numMap {
if rvalue, ok := numMap[target-key]; ok {
fmt.Println(value, rvalue)
}
}
}
func main() {
var numList = []int{2, 3, 5, 7, 11, 13}
var target = 10
sumOfNums(numList, target)
}
python
array = [2, 5, 7, 11, 13]
target = 13
def sum_func(array, target):
map_of_array = {}
for index, value in enumerate(array):
map_of_array[value] = index
for key, value in map_of_array.items():
if target - key in map_of_array.keys():
print(value, map_of_array[target-key])
sum_func(array, target)