leedcode:1. 两数之和

本人是第一次做leedcode上面的题目,有分析的不严谨的地方,请大家指正
下面是这一题的题目描述:
在这里插入图片描述

1。我们能够自然而然地想到的思路就是每次从nums这个数组中选择出两个数,再求和与target进行比较,所以在n个数中选取出2个,一共有 C n 2 C_{n}^{2} Cn2种取法,也就是n(n-1)/2种,所以总的时间复杂度是O(n^2)。在此关于这个的算法就不展示了,较为容易。
2。第二种方法:我们可以从这个角度来考虑:
      在我们遍历到nums数组的第i个元素的时候,这个数组的前 i - 1 个元素我们都是知道的,所以就可以不用在遍历一遍去寻找了,而是存储在另一个地方(也就是需要额外的空间去存储,时间上面优化往往需要牺牲一定的空间)
      那么由于我们是求解两数之和,所以我们很自然的想到两个数与target/2的差值是互为相反数的。所以我们可以利用这个差值作为特征构建一个字典,字典的键是差值的绝对值,字典的键中存放了一个list,里面有两个元素,一个是当前的索引i,另一个是这个差值(不要绝对值)(键我为什么要设置成差值的绝对值呢,因为方便差值相同的数能够定位到同一个字典项)。
      所以当出现相同的差值的数的时候,要么这个数是和原来的数完全相同,要么就是符合题目条件的那一个数,所以我们进行一次比较就可以了。
      整体上算法优化的就是寻找相同的差值的数,原先的暴力算法是从数组的第一个数开始搜索,而我们这里是使用dict字典的哈希查找,哈希查找是很快的,为O(1),所以这是两个算法时间复杂度不同的根本原因。
      下面贴出我的代码,可能有一些地方不太规范,多多包涵啦~

class Solution(object):
    def twoSum(self, nums, target):
        target = target / 2
        dict1 = dict()
        for i in range(len(nums)):
            a = dict1.get(abs(nums[i] - target))
            if a is None:
                dict1[abs(nums[i] - target)] = [i, nums[i] - target]  # 这里用一个数组存储下标和差值
            else:
                if a[1] + nums[i] - target == 0:
                    return [a[0], i]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值