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

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

具体需求:
给定一个整数数组,指定一个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
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!