前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数组-在给定数组中,快速寻找两数之和等于目标值

数组-在给定数组中,快速寻找两数之和等于目标值

作者头像
阿伟
发布2019-07-10 16:55:19
2K0
发布2019-07-10 16:55:19
举报
文章被收录于专栏:GoLang那点事GoLang那点事
问题

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素

示例

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

在看解法之前,请大家先思考下,自己该怎么解决呢


解法一

双重for循环,第一层for循环从下标为0处开始,第二层for循环从下标为1处开始,如果nums[i]+nums[j]== target,那么i和j就是需要返回的下标,这种算法时 间复杂度O(n2),对每个元素,我们都遍历数组中该元素之后剩余的元素是否有与之相加得到的和和目标值匹配,空间复杂度为O(1),在整个过程中没有申请额外的空间

代码语言:javascript
复制
func twoSum(nums []int,target int) []int {
    for i:=0;i<len(nums)-1;i++{
        for j:=0;j<len(nums);j++{
            if nums[i] + nums[j] == target{
               return []int{i,j}
            }
        }
    }
    return []int{}
}

解法二

上面的解法一有什么问题呢?大家应该都可以看的出来性能问题,那么怎么解决呢?万变不离其中,空间换时间

假定数组 nums = [2, 7, 11, 15], target = 9,假定我们已知数字2,目标值9 ,我们想知道数组中是否有7呢?我们期望有一个方法,入参为7,给我数组中7的下标,那么怎么实现呢?思路是我们把这个数组转换成map<K,V> ,k数组的值,v是值的下标,代码如下,空间复杂度O(n),时间复杂度O(n)

代码语言:javascript
复制
func twoSum(nums []int,target int) []int {
    m := make(map[int]int)
    for i,v := range nums{
        m[v]=i
    }
    for i:=0;i<len(nums)-1;i++{
        temp := target - nums[i]
        // i!=v 是防止 3+3,4+4 这种情况,比如下标为0的是3,target是6 那么会返回0,0;同一个下标了
        if v,ok :=m[temp]; i!=v &&ok{
            return []int{i,v}
        }
    }
        return []int{}
}

解法三

上面的解法而在一开始的时候就把数组的所有元素放入map中,真的需要这样做吗?如果遇到数组中重复数字(哈希冲突)怎么办?我们是否可以边遍历,如果不存在,则把当前数据放入map中,那么循环到下一次的时候,用当前值和以前放入map的值匹配,以此循环。

代码语言:javascript
复制
func twoSum(nums []int, target int) []int {
    m := make(map[int]int, len(nums))
    res := make([]int, 2)
    //遍历数组
    for index, value := range nums {
        w := target - value
        if j, ok := m[w]; ok {
            //如果存在
            //下标0放入求解值(map存在的和value相加等于target的值)的下标
            //下标1放入已知值(value)得下标
            res[0] = j
            res[1] = index
            return res
        } else {
            //如果不存在,把当前值和下标放入map中
            m[value] = index
        }
    }
    return res
}

最后,希望大家有所收获,遇到问题多思考,觉得有帮助的话帮忙分享转发一下,感谢。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang那点事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 示例
  • 解法一
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档