題目:
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那兩個整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路:
首先想到的當然是「暴力解法」,即循環遍歷兩次,找到不同元素組合是否與 target 相等,但是立馬就被自己否定了。很顯然,這個方法時間複雜度爲O(n2),在使用 python3 的情況下,不出意外一定超時,筆者又不想用 C++ 和 Java 來實現,因爲我覺得那樣屬於逃避問題。
接下來有一種優化的思路:換個角度思考,兩個元素的和等於目標值,就相當於目標值與一個元素的差值存在剩下的元素中。看起來好像ok,那就開始寫代碼吧:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
i = 0
length = len(nums)
result_index = -1
result = 0
while i < length - 1:
result = target - nums[i]
try:
result_index = nums[i+1:].index(result)
except:
i += 1
else:
return [i, nums.index(result, i+1)]
if result_index >= 0:
continue
結果也是ok的,不過筆者在這裏偷了個懶,直接用python3封裝好的函數來代替了哈希表,少寫了幾行代碼,哈哈。
優化:
雖然通過了,但還存在着優化空間。優化的基本原則是:儘量減少遍歷的次數,同時在遍歷的時候做儘可能多的事情。 因爲最影響時間複雜度的因素就是遍歷。
筆者想到的是將 nums 進行排序之後,再利用哈希表即 dict 來查找。同時在排序 nums 的同時可以比較元素與 target 的大小關係,比 target 大的元素顯然不會是答案,不需要添加至哈希表,這樣可以縮小哈希的範圍同時節省內存。合適的排序方法也應該可以提高效率。
具體實現待更 …