【力扣日记】001力扣初体验/题库编程练习|两数之和 |哈希表

愚蠢的我第一次做力扣的题库,点开题懵逼了。
答题界面如下:

图1

看着这个空旷的界面我陷入了沉思,输入在哪?输出在哪?

我操着用OJ的思路来了发input和print,毫无疑问的失败了,于是看着模板提示陷入了沉思。
  那试试类?
  于是对着编码区又是一番操作,好嘛,失败。
  但是我想着用类应该是没错的,于是:
  图2
  好歹成功运行代码没报错嘛!笑。
  
  果然,输入就是图1所示方法中的两个参数,且给出了参数的类型,如图1,nums是list[int],是一个列表对象,且其中的元素都是数值类型。
  至于输出,当我使用print再次失败后我猜想输出应该是使用return,实践果然如此。

所以第一题的编程就是完善Solution类下的sumTwo方法,输入是方法的参数,输出是使用return。

第一题答案预警!

·
·以下都是答案和分析。
·
·
·
·
·
·
·
·
·
·

class Solution:
    def twoSum(self, nums, target):
        ls = [x for x in range(len(nums))]
        dt = dict(zip(ls, nums))
        for i in dt:
            for j in dt:
                if i>=j:
                    continue
                if dt[i]+dt[j]==target:
                    return ([i,j])

执行用时:7784 ms,内存消耗:15.8 MB,环境:Python3

作为菜菜子的我用暴力穷举法的思路,虽然成功了但是时间复杂度总的来说是O(n^2),所以耗时极………………………………………………长。

垃圾方法还是pass掉好啦。

本来想把力扣里大佬的python解法搬过来的,但想着可能重复了,还是只贴一个链接吧。——➡大佬整理的思路和代码

——————
发现大佬整理的答案不全,也存在一些问题,还是也写一个好了。

class Solution:#核心思路是看两者差值是否也在列表里
    def twoSum(self, nums, target):
        j=-1
        for i in range(len(nums)):
            if (target - nums[i]) in nums:
                if (nums.count(target - nums[i]) == 1)&(target - nums[i] == nums[i]):#如果num2=num1,且nums中只出现了一次,说明找到是num1本身。
                    continue
                else:
                    j = nums.index(target - nums[i],i+1) #index(x,i+1)是从num1后的序列后找num2
                    break
        if j>0:
            return [i,j]
        else:
            return []
#核心思路是看两者差值是否也在列表里,且对比范围直接从i后一位开始。
class Solution:
    def twoSum(self, nums, target):
        j=-1
        for i in range(0,len(nums)):
            temp = nums[i+1:]
            if (target - nums[i]) in temp:
                j = temp.index(target - nums[i])+i+1
                break
        if j>=0:
            return [i,j]

执行时间:856 ms 内存消耗:14.7 MB

总是进行一次遍历,那么遍历过程中用哈希表记录数据可以方便之后的查找。

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

s=Solution()
nums = [1,2,4,5,5,5,5]
target = 6
print(s.twoSum(nums,target))

这个方法也可以得到结果,但问题在于,一旦列表中有重复的元素,以元素作为字典的键得到的值一定是重复元素中的较大索引值。

#优化方法为:
class Solution:
    def twoSum(self,nums, target):
        """这样写更直观,遍历列表同时查字典,同步将值插入字典。"""
        dct = {}
        for i, n in enumerate(nums):
            if target - n in dct:
                return [dct[target - n], i]
            dct[n] = i
s=Solution()
nums = [1,2,5,5,5,5,5,5,6]
target = 6
print(s.twoSum(nums,target))

执行用时 :64 ms, 在所有 python3 提交中击败了92.25%的用户
内存消耗 :15.1 MB, 在所有 python3 提交中击败了5.05%的用户

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值