前言
博客里新开一个“用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
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()函数能够把一个List按照索引从小到大的顺序组成一个字典。 python enumerate用法总结cdn