0001 两数之和/two-sum
题目描述/Description
给定一个整数数组nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice.
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/tw… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
复制代码
- 思路1
a + b = target
b = target - a
遍历nums将每个数字的位置记录到map中,然后在map中寻找target - a将算法时间复杂读降到O(n)
代码实现
package problem0001
func twoSum(nums []int, target int) []int {
index := make(map[int]int, len(nums))
for i, b := range nums {
if j, ok := index[target-b]; ok {
return []int{j, i}
}
index[b] = i
}
return nil
}
复制代码
单元测试
package problem0001
import (
"testing"
"github.com/stretchr/testify/assert"
)
type para struct {
one []int
two int
}
type ans struct {
one []int
}
type question struct {
p para
a ans
}
func TestTwoSum(t *testing.T) {
ast := assert.New(t)
qs := []question{
question{
p: para{
one: []int{3, 2, 4},
two: 6,
},
a: ans{
one: []int{1, 2},
},
},
question{
p: para{
one: []int{3, 2, 4},
two: 8,
},
a: ans{
one: nil,
},
},
}
for _, q := range qs {
a, p := q.a, q.p
ast.Equal(a.one, twoSum(p.one, p.two), "输入:%v", p)
}
}
复制代码