golang:给定一个数字切片,用时间复杂度为O(n)的算法找出所有和为10的数字组合
input: [1, 3, 4, 7, 8, 6]
output: 3 and 7; 4 and 6
代码示例:
package main
import "fmt"
func main() {
inputSlice := []int{1, 3, 4, 7, 8, 6}
numMap := map[int]int{}
for _, num := range inputSlice {
numMap[num] = num
}
for _, num := range inputSlice {
if anotherNum, exist := numMap[10-num]; exist {
fmt.Printf("%d and %d;", num, anotherNum)
}
}
}
执行输出结果:
3 and 7;4 and 6;7 and 3;6 and 4;
可以看到初步的输出结果,但离我们想要的结果还有差距,主要是存在重复的情况
进一步的优化代码如下:
package main
import "fmt"
func getPair(){
sum := 10
inputSlice := []int{1, 3, 4, 7, 8, 6}
numMap := map[int]int{}
retMap := map[int]int{}
for _, num := range inputSlice {
numMap[num] = num
}
for _, num := range inputSlice {
if anotherNum, exist := numMap[sum-num]; exist {
if _, exist := retMap[anotherNum]; !exist {
retMap[num] = anotherNum
}
//fmt.Printf("%d and %d;", num, anotherNum)
}
}
for k, v := range retMap {
fmt.Printf("%d and %d;", k, v)
}
}
func main() {
getPair()
}
执行输出结果:
3 and 7;4 and 6;
将数字组合另存一个map中,来控制重复的情况