LeetCode刷题(python版)——Topic1两数之和

一、题设

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
 

二、基本思路

1.way01:利用暴力法穷举两遍列表,第一遍循环用于取出待确定目标,第二遍用于查找符合条件的第二个数,复杂度n方。

2.way02:基于way01的基础上,第一遍循环不变,第二遍从取出待确定目标之后查找(第二遍的值肯定不在之前查找过的列表中),复杂度也n方,但由于每次查找少找了一些重复数据,那么速度较way01更快。

3.way03:哈希查找复杂度为常数级,那么可以利用哈希法配合字典求解,其中用到enumerate函数,该函数多用于在for循环中得到计数,利用它可以同时获得索引和值;利用字典的好处在于它可以同时存储数据的索引(index)value)。先将数据全部一个个放入字典中,再去重新遍历一遍数据找第二个数据,就等于是进行了两次单独循环,复杂度为2n。

4.way04:在way03基础上,边比较边存入字典,复杂度为n。

三、代码实现

1.way01:简单,参考way02

2.way02:

  def twoSum(self, nums, target):
       lens = len(nums)
       for i in range(1,lens):
           temp = nums[:i]
           if (target-nums[i]) in temp:
               j = temp.index(target-nums[i])
               return j,i

3.way03:


    def twoSum(self, nums, target):
        hashmap = {}
        for index,num in enumerate(nums):
            hashmap[num] = index
        for i,num in enumerate(nums):
            j = hashmap.get(target - num)
            if i!=j and j is not None:
                return i,j

4.way04:


    def twoSum(self, nums, target):
        hashmap = {}
        for i,num in enumerate(nums):
            if hashmap.get(target - num) is not None:
                return hashmap.get(target - num),i
            hashmap[num] = i 

四、效率总结:     

图:way02~04算法效率比较

        无疑,way01和way02暴力法一般的编码者都可以想出来,而哈希在对于找数查数中有着很高的效率表现,故也是容易想到的。暴力法和哈希法所表现出的,暴力法一般效率在n方,而哈希在n,优化了一个数量级。而在于way01和way02之间的差距,即way03和way04之间的差距,九牛一毛。相比时间来说,本题只要用到hash法解出,效率方面就不会有太大的问题。明天见~

   

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值