01-兩數(shù)之和
給定一個整數(shù)數(shù)組 nums
和一個目標值 target
著蛙,請你在該數(shù)組中找出和為目標值的那 兩個 整數(shù),并返回他們的數(shù)組下標题禀。
你可以假設每種輸入只會對應一個答案吞加。但是,數(shù)組中同一個元素不能使用兩遍往衷。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
回答可執(zhí)行的代碼:
def two_sum(nums, target):
"""這樣寫更直觀,遍歷列表同時查字典"""
dct = {}
for i, n in enumerate(nums):
# print("i=%s,n=%s" % (i, n))
cp = target - n
# print("target=%s,cp=%s" % (target, cp))
if cp in dct:
# print(dct[cp], i)
return [dct[cp], i]
else:
dct[n] = i
nums = [2,7,5,6,3]
target = 9
two_sum(nums,target)
# 我想請教一下對于最后一句為什么還要加呢严卖?
# 當然要加席舍,不給字典賦值的話 dct 永遠為空,還怎么做 in 判斷呢 ~~
官方題解:
方法一:暴力枚舉
思路及算法
最容易想到的方法是枚舉數(shù)組中的每一個數(shù) x哮笆,尋找數(shù)組中是否存在 target - x来颤。
當我們使用遍歷整個數(shù)組的方式尋找 target - x 時,需要注意到每一個位于 x 之前的元素都已經(jīng)和 x 匹配過稠肘,因此不需要再進行匹配福铅。而每一個元素不能被使用兩次,所以我們只需要在 x 后面的元素中尋找 target - x项阴。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
for i in range(n):
for j in range(i + 1, n):
if nums[i] + nums[j] == target:
return [i, j]
return []
復雜度分析
- 時間復雜度:O(N^2)O(N2)滑黔,其中 NN 是數(shù)組中的元素數(shù)量。最壞情況下數(shù)組中任意兩個數(shù)都要被匹配一次鲁冯。
- 空間復雜度:O(1)O(1)拷沸。
方法二:哈希表
思路及算法
注意到方法一的時間復雜度較高的原因是尋找 target - x 的時間復雜度過高。因此薯演,我們需要一種更優(yōu)秀的方法撞芍,能夠快速尋找數(shù)組中是否存在目標元素。如果存在跨扮,我們需要找出它的索引序无。
使用哈希表,可以將尋找 target - x 的時間復雜度降低到從 O(N)O(N) 降低到 O(1)O(1)衡创。
這樣我們創(chuàng)建一個哈希表帝嗡,對于每一個 x,我們首先查詢哈希表中是否存在 target - x璃氢,然后將 x 插入到哈希表中哟玷,即可保證不會讓 x 和自己匹配。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict()
for i, num in enumerate(nums):
if target - num in hashtable:
return [hashtable[target - num], i]
hashtable[nums[i]] = i
return []
復雜度分析
時間復雜度:O(N)O(N)一也,其中 NN 是數(shù)組中的元素數(shù)量巢寡。對于每一個元素 x,我們可以 O(1)O(1) 地尋找 target - x椰苟。
空間復雜度:O(N)O(N)抑月,其中 NN 是數(shù)組中的元素數(shù)量。主要為哈希表的開銷舆蝴。
高贊回答:
def two_sum(nums, target):
"""這樣寫更直觀谦絮,遍歷列表同時查字典"""
dct = {}
for i, n in enumerate(nums):
cp = target - n
if cp in dct:
return [dct[cp], i]
else:
dct[n] = i
拓展:
Python enumerate() 函數(shù)
描述
enumerate() 函數(shù)用于將一個可遍歷的數(shù)據(jù)對象
(如列表题诵、元組或字符串)組合為一個索引序列,
同時列出數(shù)據(jù)和數(shù)據(jù)下標层皱,一般用在 for 循環(huán)當中性锭。
語法
以下是 enumerate() 方法的語法:
enumerate(sequence, [start=0])
參數(shù)
- sequence -- 一個序列、迭代器或其他支持迭代對象奶甘。
- start -- 下標起始位置篷店。
返回值
返回 enumerate(枚舉) 對象。
實例
以下展示了使用 enumerate() 方法的實例:
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))