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 []int{i, 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 []int{i, 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 []int{j, i}
        }
        
        numIndex[num] = i
    }
    
    return nil
}

至此,本次分享就结束了,后期会慢慢补充。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

扫码关注公众号,获取更多优质内容

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>