用python手刃Leetcode(1):两数之和【简单题】

前言

博客里新开一个“用python手刃Leetcode”的专题,顾名思义,主要目的是记录本身在Leetcode上刷题的过程,代码全程用python3编写,所用网址是:leetcode中国。这个网址的好处是:1)纯中文,解决了英语很差读题困难的问题;2)网页打开速度快。 ` 同时能够看到:目前官网给出的解题代码是用java编写的,并无给出官方的python解答,本专栏除了尽可能使用多种解法给出每道题的python3解答代码以外,还会记录下本身在作题过程当中的一些收获和思考。便于之后复习查阅。java

题目

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

示例:数组

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

由于 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()函数。就像这样:spa

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

可是,这种暴力解法因为时间复杂度过高,通常是没有办法来经过leetcode的,会报错以下: .net

这里写图片描述

方法二:创建哈希表进行求解。
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中记录下来的索引。code

方法三:利用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)]
复制代码
解题收获:
一、enumerate()函数的使用

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

二、python中定义Class的模板
相关文章
相关标签/搜索