leetCode题目
一.
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用
e.g.
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
代码实现如下
def twoSum(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for a in range(len(nums)):
for b in nums:
if b + nums[a] == target:
if a != nums.index(b):
return a, nums.index(b)
else:
continue
分析:首先遍历列表的索引赋值给a和列表的元素赋值给b,紧接找到符合条件的一个元素与另一个元素的索引,然后判断两个元素的索引值是否不同,如果不同则返回两个元素的索引,相同则进行下一次循环 。
仔细想想这个程序进行了两次遍历,时间复杂度为O(n^2)
,leetcode测试时间显示为令人咋舌的7312ms
,显然这不是最优解,当然如果这是你第一次刷题,无可后非这样做是可以的,仔细分析一下就可知道查找一个元素是否在列表中的时间复杂度是O(n)
,而查找一个键是否在字典中的时间复杂度是O(1)
,那么我们可不可以尝试着用字典来解决这道题呢?当然可以!
优化:
def twoSum(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dic = {}
for i, num in enumerate(nums):
if target-num in dic:
return dic[target-num], i
else:
dic[num] = i # 创建字典键值对
此程序的巧妙之处在于将列表转换为字典的形式,以列表的元素作为字典的键值,然后查找字典的键值是否满足条件,由于生成和查找字典的键值对的时间复杂度均为O(1)
,所以此程序的时间复杂度为O(n)
喜欢开源,乐于分享,请多指教