版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
【问题描述】
给定一个数组,求两个数之和=给定值sum的所有组合个数。
【变形】两个数之和=sum的任意一组数
【方法一】穷举法
从数组中任意找两个数,看其和是否=sum。时间复杂度O(N^2)
【方法二】hash表法
只需要遍历一遍数组,非常高效
思路:定义一个map,一开始为空,不存数据,开始遍历数组,判断第一个元素是否有另一半已经在map中,如果有count++,没有的话,把第一个元素存入map;继续遍历第二个元素,判断第二个元素是否有另一半已经在map中,如果有count++,没有的话,把第二个元素存入map…遍历结束,结果也出来了
package main
import (
"fmt"
)
func getSumNum(arr []int, sum int) int {
tp := make(map[int]int)
var count int
for i := 0; i <= len(arr)-1; i++ {
if _, ok := tp[sum-arr[i]]; ok {
count++
} else {
tp[arr[i]] = i
}
}
return count
}
func main() {
var brr []int = []int{1, 12, 14, 40, 56, 60, 88, 78, 99}
var sum int = 100
fmt.Println(getSumNum(brr, sum))
}
//结果:3