2020.05.25 力扣 - 数组 - 01 两数之和

116 阅读1分钟

题目

给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。

但是,数组中同一个元素不能使用两遍。

示例

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

方法一:

/*
两次循环:
时间复杂度:O(n^2)
*/
func way1(nums []int, target int) (ret []int) {
   startTime := time.Now().Nanosecond()
   cnt := len(nums)
   for i := 0; i < cnt; i++ {
      for j := 0; j < cnt; j++ {
         if nums[i]+nums[j] == target && i != j {
            ret = []int{i, j}
            break
         }
      }
   }
   endTime := time.Now().Nanosecond()
   fmt.Println("way1 consume: ", endTime-startTime)
   return ret
}

方法二:用空间换时间

/*
一次循环+字典:
时间复杂度:O(n^2)
*/
func way2(nums []int, target int) (ret []int) {
   startTime := time.Now().Nanosecond()
   numsMap := make(map[int]int, 0)
   for ix, num := range nums {
      numsMap[num] = ix
   }
   for ix, num := range nums {
      if _, ok := numsMap[target-num]; ok && ix != numsMap[target-num] {
         ret = []int{ix, numsMap[target-num]}
      }
   }
   endTime := time.Now().Nanosecond()
   fmt.Println("way2 consume: ", endTime-startTime)
   return ret
}

结果: