一、题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
二、题目分析
方法1:循环嵌套
此题目相当于分解目标值为数组中两个数的和,所以只要循环遍历,穷举每种组合就可以找到答案,此处遍历需要两层嵌套循环,对应时间复杂度为O(n^2);
方法2:利用 hash map 标记
另一种解法,存储元素值 hash map,然后通过 target - map[n] 的值,直接从数组中查找另一个值,这样避免了嵌套的循环,只需要两个独立的循环结构和一个hash map即可,时间复杂度为O(n);
三、代码实现
// leetcode_1. 两数之和
// 欢迎继续优化代码
package main
import (
"fmt"
)
func main() {
nums := []int{7, 6, 5, 4, 3, 2, 1}
fmt.Println(twoSum(nums, 6))
fmt.Println(twoSum2(nums, 7))
}
// 循环嵌套
func twoSum(nums []int, target int) []int {
length := len(nums)
i := 0
j := 0
for i = 0; i < length; i++ {
for j = i + 1; j < length; j++ {
if target == nums[i]+nums[j] {
return []int{i, j}
}
}
}
return []int{}
}
// hash map 标记
func twoSum2(nums []int, target int) []int {
res := []int{}
numsMap := map[int]int{}
for i, v := range nums {
numsMap[v] = i
}
for i, v := range nums {
find := target - v
if j, ok := numsMap[find]; ok && j != i {
if j < i {
j, i = i, j
}
res = append(res, i, j)
break
}
}
return res
}
运行结果:
[2 6]
[1 6]
Process finished with exit code 0
——2019-07-17——