例如数组[2,3,1,4,3,2,5] 给定6 结果为[3,3],[2,4],[1,5]
难度:三星
面试频率:三星

思路:
这道题的第一感觉是想到使用2重循环,但是算法题一旦使用多重循环就失去了面试的意义,基本都是面试不通过
这道题的核心是sum.可以从这个变量出发,一般要做到时间复杂度O(n)的话都需要借助一个辅助容器,因此就得到sum+辅助容器map的思路
进一步思考,遍历的时候遇到元素v可以作为key存入map中。因为下一个遇到了sum-v就是要找到的数,map的value可以用一个计数,如果重复遇到v则将计数++,遇到sum-v,则计数--,为0则删除表示配对成功。
go语言代码如下:
func Solution( sum int ){ var array = [14]int{3,8,7,6,4,2,5,1,2,3,2,2,3,3} map1 := make(map[int]int,0) for _,v := range array{ tmp := sum - v if count,ok := map1[tmp];ok{ count -= 1 if count == 0{ delete(map1,tmp) }else{ map1[tmp] = count } //配对成功 fmt.Printf( "%d,%d\n",tmp,v) }else{ if _,ok := map1[v];ok{ map1[v] += 1 }else{ map1[v] = 1 } } }}