一個小小的演算法題:求兩數之和

程式設計愛好者發表於2021-03-01

一個小小的演算法題:求兩數之和

具體需求:
給定一個整數陣列,指定一個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 協議》,轉載必須註明作者和本文連結

相關文章