Go-Leecode-两数之和(刷题记录)

Posted luyaran

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go-Leecode-两数之和(刷题记录)相关的知识,希望对你有一定的参考价值。

原文地址: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]

以下为部分提示:

  1. 2 <= nums.length <= 103。

  2. -109 <= nums[i] <= 109。

  3. -109 <= target <= 109。

  4. 只存在一个有效答案。

这题目拿到手之后,下意识就想到了暴力输出的方案,如下:

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-两数之和(刷题记录)的主要内容,如果未能解决你的问题,请参考以下文章

力扣刷题记录——两数之和

力扣刷题记录——两数之和

力扣刷题记录——两数之和

力扣刷题记录——两数之和

LeetCode Java刷题笔记—1. 两数之和

LeetCode Java刷题笔记—1. 两数之和