题目来源
问题描述
给定一个整数数列,找出其中和为特定值的那两个数。
你可以假设每个输入都只会有一种答案,同样的元素不能被重用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解决方案
"""
@author: LiShiHang
@software: PyCharm
@file: 1.两数之和.py
@time: 2018/12/21 21:20
@desc:
"""
class Solution:
# 解法一:暴力法,时间复杂度$O(n**2)$
def twoSum(self, nums, target):
for i in range(len(nums) - 1):
# 一种写法,6053ms
# for j in range(i + 1, len(nums)):
# if nums[j] == target - nums[i]:
# return [i, j]
# 另一种写法,较快,1016ms
try:
j = nums[i + 1:].index(target - nums[i]) + i + 1
except BaseException:
pass
else:
return [i, j]
return
# 解法二:哈希;
# 因为哈希表的键使用哈希函数映射,所以只需要常数时间即可查到另一个健;由于要返回索引,哈希值存的即为索引
# 时间复杂度$O(n)$,48ms
def twoSum2(self, nums, target):
dc = {data: i for i, data in enumerate(nums)}
for i in range(len(nums) - 1): # 前面已经检查过最后一个
value = target - nums[i]
if value in dc:
j = dc.get(value)
if i != j:
return [i, j]
return
def twoSum2_2(self, nums, target):
# 解法二另一种写法,边建字典边查找,44ms
dc = {}
for i in range(len(nums)): # 此处应遍历所有
value = target - nums[i]
if value in dc:
j = dc.get(value)
return [i, j] # 此时i、j肯定不会相等
dc[nums[i]] = i
return
if __name__ == '__main__':
nums = [3, 2, 4]
target = 6
ob = Solution()
r = ob.twoSum2_2(nums, target)
print(r)