1.兩數之和
題目描述:給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
題目解法:
1.首先想到暴力解法,兩層循環遍歷所有的數字組合情況,得到符合要求的一組解對應的數字下標組合。這種方法的時間複雜度爲O(),效率較低,有一定超時風險。空間複雜度爲O(1)。
2.爲了優化時間複雜度,想到運用hash表的方法記錄數字的索引。這樣只需要循環兩邊:第一遍循環nums數組將數字和對應下標記錄在hash表中,第二次循環判斷另一個加數(target-當前數字)是否存在於hash表中。這樣時間複雜度爲O(n),空間複雜度O(n)。
3.以上方法可以再次優化。僅做一次循環,循環時判斷當前數字的另一加數是否在表中,如果在則輸出答案,如果不在則將當前數字和索引記錄入hash表。這樣做的時間複雜度爲O(n)(因爲少了一次循環,可以認爲是從2n優化到n),空間複雜度爲O(n)(這樣在最差情況下需要n的空間,而方法2中必定需要n空間,空間複雜度上也有優化)
代碼:
本題我使用了python作爲編程環境,使用python中的字典構建hash表。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
sumdict = {}
for i in range(len(nums)):
another_num = target - nums[i]
if another_num in sumdict:
return [sumdict[another_num],i]
sumdict[nums[i]] = i