今天在leetcode上面开始了第一次刷题。
题目为:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
我的代码为:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for num1 in nums:
num2 = target - num1
a=nums.index(num1)
if num2 in nums[a+1:]:
return [a,nums.index(num2,a+1,)]
return None
执行用时:1372 ms 内存消耗:14MB
这个程序运行时间还是有点长,不太让人满意。
我的思路为:在列表中遍历每个元素,然后让目标值减去当此循环中的元素,
如果结果在这个列表中,反过来其实就是题目中的意思,两值相加等于目标值。
不过,我这样写的思路一定要另外避免类似6-3=3的情况,看下面的代码
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for num1 in nums:
num2 = target - num1
a=nums.index(num1)
if num2 in nums:
return [a,nums.index(num2)]
return None
假设列表的内容为[3,2,4]
目标值为6,如果当初没有考虑清楚最后输出结果。
这样循环,假如当次的值为3,6-3=3, 而3恰好就等于这次的循环对应值,即使列表只有一个3也可以通过条件,但肯定会错,因为题目要求输出两个数的下标,正确结果应该是2和4的下标,这样写,在这样的例子下输出的一定是[0,0]
为了改进我的算法,我去请教了一些大神的算法,其中有一个感觉挺好:
class Solution:
def twoSum(self, nums: list, target: int) -> list:
temp = {}
for i in range(len(nums)):
left = target - nums[i]
if left in temp:
return [temp[left], i]
else:
temp[nums[i]] = i
他的精妙之处在于用了一个比较好的方法解决了我在上面提出的问题,他创建了一个空字典,然后把列表中的元素逐一加入,重要的是先判断再加入,这样就避免了6-3=3这种结果和减数本身相同的情况,因为减数当时还不在字典里。
算法题确实比普通的练习题要好很多,希望能够坚持下去,让自己有很大的提升。