美文网首页学python不出局程序员
零基础python刷leetcode -- 1. Two Sum

零基础python刷leetcode -- 1. Two Sum

作者: 三也视界 | 来源:发表于2017-11-19 16:35 被阅读787次

    算法很重要,但是每天也需要学学python,于是就想用python刷leetcode 的算法题,从第一题开始,从简单题开始零基础python刷leetcode之旅。

    leetcode 地址

    1.第一题:Two Sum

    Two Sum

    首先过一下python的一些基础知识,非小白请直接跳过

    self

    self 只有在类的方法中才会有,独立的函数或方法是不必带有self的。所以self名称不是必须的。另外,self也不是作为参数传递使用的,当然也不是关键词,只是约定成俗的写法,可以用a或b,甚至将self改为myself一样没有错误。
    self指的是类实例对象本身(注意:不是类本身),相当于Java 的this

    rang

    >>> range(1,5) #代表从1到5(不包含5)
    [1, 2, 3, 4]
    >>> range(1,5,2) #代表从1到5,间隔2(不包含5)
    [1, 3]
    >>> range(5) #代表从0到5(不包含5)
    [0, 1, 2, 3, 4]
    

    append

    >>>mylist = [1,2,0,'abc']
    >>>mylist
    [1, 2, 0, 'abc']
    
    >>>  mylist.append(4)
    >>>  mylist
    [1, 2, 0, 'abc', 4]
    

    时间戳

    import time
    import datetime
    
    t = time.time()
    
    print (t)                       #原始时间数据
    print (int(t))                  #秒级时间戳
    print (int(round(t * 1000)))    #毫秒级时间戳
    
    nowTime = lambda:int(round(t * 1000))
    print (nowTime());              #毫秒级时间戳,基于lambda
    
    print (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))   #日期格式化
    

    str() 排序

    str() 函数将对象转化为适于人阅读的形式。

    >>>s = 'RUNOOB'
    >>> str(s)
    'RUNOOB'
    >>> dict = {'runoob': 'runoob.com', 'google': 'google.com'};
    >>> str(dict)
    "{'google': 'google.com', 'runoob': 'runoob.com'}"
    >>>
    

    题目

    输入一个数组和target,要在一个数组中找到两个数字,其和为target,从小到大输出数组中两个数字的位置。题目中假设有且仅有一个答案

    方法一:暴力解决方法

    import time
    
    class Solution(object):
        def twoSum(self, nums, target):
            result = []
            t1 = time.time()
            for i in range(len(nums)):
                for j in range(i+1, len(nums)):
                    if nums[i] + nums[j] == target:
                        result.append(i)
                        result.append(j)
                        print(time.time() - t1)
                        return result
    

    最简单的循环嵌套,时间复杂度是O(n*n)。还有没有更好的算法吗?

    方法二:字典

    python字典的key-value原理属于hashtable的范畴,Python中最常用的数据类型之一,它是一个键值对的集合,字典通过键来索引,关联到相对的值,理论上它的查询复杂度是 O(1) :

    首先,我们建立一个字典,d = {},字典的key是数组的值num(key一般是已知确定的值,所以用num),value是相应的位置, 然后只要满足 num 和 target - num都在字典里面则找到答案。这种方法的时间复杂度是(O(n))。

    class Solution(object):
        def twoSum(self, nums, target):
            size = 0
            d = {}
            while size < len(nums):
                #先把数组存到字典里面
                if not nums[size] in d:#key不在字典里,进行赋值
                    d[nums[size]] = size
                if target - nums[size] in d:# nums[size] 和 target - nums[size]都在字典里,即存在和为他人个体/的两个数
                    # 这里key 有可能指向同一个数(即 target - nums[size] =  nums[size]时,他其实只有一个数)
                    if d[target - nums[size]] < d[nums[size]]:
                        # d的值从小到大输出
                        result = [d[target - nums[size]], d[nums[size]]]
                        return result
    # 注意size = size + 1是和最外层的if平级的
                size = size + 1
    

    相关文章

      网友评论

      • zer0_f177:文章写的不错,能不能让我们学校这方面的公众号转载一下,会注明作者和出处。
        三也视界:@zer0_f177 👌

      本文标题:零基础python刷leetcode -- 1. Two Sum

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