Go-Leecode-两数之和(刷题记录)
Posted luyaran
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go-Leecode-两数之和(刷题记录)相关的知识,希望对你有一定的参考价值。
给定整数数组nums及整数目标值target,需在nums中找到两数和为target值的下标,数组中同一元素不能重复出现且只有一组元素和为target值,可按任意顺序返回结果,以下为三个示例:
示例一:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
这里稍微解释一下哈,因为nums的第一个元素加上第二个元素为target值,所以需返回这两个元素的下标值,以下同理哈。
示例二:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例三:
输入:nums = [3,3], target = 6
输出:[0,1]
以下为部分提示:
-
2 <= nums.length <= 103。
-
-109 <= nums[i] <= 109。
-
-109 <= target <= 109。
-
只存在一个有效答案。
这题目拿到手之后,下意识就想到了暴力输出的方案,如下:
func twoSum(nums []int, target int) []int
n := len(nums)
for i := 0; i < n-1; i++
for j := i + 1; j < n; j++
if nums[i] + nums[j] == target
return []inti, j
return nil
但仔细想了想,可以考虑使用哈希表索引的方式来实现,如下:
func twoSum(nums []int, target int) []int
numIndex := make(map[int]int, len(nums))
for i, num := range nums
numIndex[num] = i
for i, num := range nums
pair := target - num
// 这一步主要是为了剔除自身相加的情况
// 使用哈希表需要注意,索引重叠是同一元素
if j, ok := numIndex[pair]; ok && i != j
return []inti, j
return nil
个人认为哈希表特别适合抽象类的配对结构,当要解决问题的数据单元是成对数据关系时,可以考虑使用哈希表map结构。
以上代码仔细考虑一下的话,进行了两次for循环,感觉还可以再优化一点点,将两次循环合并,一遍循环,一边检查,来看下:
func twoSum(nums []int, target int) []int
numIndex := make(map[int]int, len(nums))
for i, num := range nums
pair := target - num
if j, ok := numIndex[pair]; ok && i != j
return []intj, i
numIndex[num] = i
return nil
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。
以上是关于Go-Leecode-两数之和(刷题记录)的主要内容,如果未能解决你的问题,请参考以下文章