一个小小的算法题:求两数之和

一个小小的算法题:求两数之和#

具体需求:
给定一个整数数组,指定一个 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 协议》,转载必须注明作者和本文链接
fengzi