一個小小的演算法題:求兩數之和
具體需求:
給定一個整數陣列,指定一個target值,通過整數陣列裡的兩個值相加後結果等於target值。最後返回這兩個值的索引值
舉個例子:
number := []int{123,12,4,53, 66}
target := 16
number裡的 12 + 4 = 16
對應的下標是number[1] 和 number[2]
大概有兩種寫法:
第一種暴力演算法,就是寫兩個for迴圈,通過對比兩個數的方式來求出結果:
package main
import "fmt"
func main () {
num := []int{12, 4, 6, 78, 9, 1, 66}
target := 16
for i := 0; i <= len(num) - 1; i++ {
for j := 1; j <= len(num) - 1; j++ {
if num[i] + num[j] == target {
fmt.Println(i, j);
}
}
}
}
這樣效率不是太高,如果需要處理的數很多,就會很耗時了
第二種寫法:利用雜湊查詢法
package main
import "fmt"
func main() {
num := []int{12, 3, 4, 63, 45, 6, 8, 7, 89, 9}
target := 16
//定義一個集合
hasTable := map[int]int{}
//迴圈處理
for key, val := range num {
//如果查詢的值已經存在map裡了,列印出結果值
if index, ok := hasTable[target - val]; ok {
fmt.Println(index, key);
break;
}
//如果不存在,把值存進map裡
hasTable[val] = key
}
}
這種寫法省去了一層迴圈,程式碼看起來也相對更簡潔了。查詢效率相對第一種也提高了一些。
第二種的這種處理方式就是:[先把值存進雜湊表裡,然後通過相減的方式(target - n)求到結果]。第一次時,hasTable裡一定是空的,接著會把值存進去,後面的第二次和N次迴圈時,如果target - n 後能求到結果,說明在此之前值已經存進去了。
簡單的一道演算法題,主要是為了練習一下演算法!^_^
本作品採用《CC 協議》,轉載必須註明作者和本文連結