美文网首页python自学程序员
用python手刃Leetcode(1):两数之和

用python手刃Leetcode(1):两数之和

作者: 东写西读1 | 来源:发表于2018-06-12 21:21 被阅读20次
    用python手刃Leetcode(1):两数之和
    前言

    临近秋招,要开始苦逼的找工作之旅,IT类面试,算法考察是必不可少的一个环节。所以在博客里新开一个“用python手刃Leetcode”的专题,顾名思义,主要目的是记录自己在Leetcode上刷题的过程,代码全程用python3编写,所用网址是:leetcode中国。这个网址的好处是:1)纯中文,解决了英语不好读题困难的问题;2)网页打开速度快。

    同时可以看到:目前官网给出的解题代码是用java编写的,并没有给出官方的python解答,本专栏除了尽量使用多种解法给出每道题的python3解答代码之外,还会记录下自己在做题过程中的一些收获和思考。便于以后复习查阅。

    题目

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
    你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

    示例:

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

    因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

    暴力解法

    首先不管三七二十一,利用暴力解法来尝试。

    class Solution:
        def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            renum = []
            n = len(nums)
            for i in range(n):
                for j in range(i+1,n):
                    if nums[i]+nums[j] == target:
                        renum.append(i)
                        renum.append(j)
                        break   
            return(renum)
    

    【备注】:对于一个函数来说,程序在执行return()后会自动停止,即在函数中,return有break的功能。所以,以上代码可以做一个小优化:在break处直接写return()函数。就像这样:

    ……
    if nums[i]+nums[j] == target:
        renum.append(i)
        renum.append(j)
        return(renum) #此处直接用return代替break
    

    但是,这种暴力解法由于时间复杂度太高,一般是没有办法来通过leetcode的,会报错如下:


    这里写图片描述
    方法二:建立哈希表进行求解。
    class Solution:
        def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            dic = {}
            for i, num in enumerate(nums):
                if num in dic:
                    return [dic[num], i]
                else:
                    dic[target - num] = i
    

    这个解法的思路是:首先把原来的List建成一个字典,然后新建另一个空字典,每次在字典中存储时,dic的key:target - num,value:原List组成的字典值对应的索引。如果检测到某个nums中的值已经存在于新建的字典中,那么证明可以组成一个target值,这时返回此刻遍历到的索引与dict中记录下来的索引。

    方法三:利用python切片。
    class Solution:
        def twoSum(self, nums, target):
            for i in range(len(nums)):
                if target-nums[i] in nums[i+1:]:
                    return [i,nums.index(target-nums[i],i+1)]
    
    解题收获:
    1、enumerate()函数的使用

    enumerate()函数可以把一个List按照索引从小到大的顺序组成一个字典。
    python enumerate用法总结

    2、python中定义Class的模板

    相关文章

      网友评论

        本文标题:用python手刃Leetcode(1):两数之和

        本文链接:https://www.haomeiwen.com/subject/fngreftx.html