问题一 力扣题目链接
注意题目要求返回索引
利用哈希表(或者叫map、映射、字典、dictionary,意思都一样)求解(已提交通过)
func twoSum(nums []int, target int) []int {
l := len(nums)
if l < 2 {
return nil
}
m := make(map[int]int) // 元素值->索引
for i, n := range nums {
a := target-n
if j, ok := m[a]; ok {
return []int{j,i}
} else {
m[n] = i
}
}
return nil
}
问题二 稍加扩展
将原题改为“数组中的数可能有重复。找到和为target的两个数。答案可能有多个。返回值的多个二元组之间不能重复。你可以按任意顺序返回答案。找不到符合条件的数就返回空”。
如 nums=[3,3,2,1,1,4],target=5,返回[[3,2][1,4]]。
如 nums=[1,1,1,2,3,5,-1,-1,-2],target=0,返回[[1,-1][2,-2]]。
如 nums=[1],target=2,返回[]。
如 nums=[],target=5,返回[]。
如 nums=[1,2,7,5,6],target=1000,返回[]。
这里给出一种实现(测试通过)
import "sort"
func twoSum(nums []int, target int) [][]int {
length := len(nums)
if length < 2 {
return nil
}
sort.Sort(sort.IntSlice(nums)) // 排序
var (
l int
r = length-1
res [][]int
)
for l < r {
lv := nums[l]
rv := nums[r]
sum := lv+rv
if sum == target {
res = append(res, []int{lv, rv})
}
if sum <= target {
for l < r && nums[l] == lv { // 去重
l++
}
}
if sum >= target {
for l < r && nums[r] == rv { // 去重
r--
}
}
}
return res
}