兩數之和(Python3實現)

題目:

給定一個整數數組 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 大的元素顯然不會是答案,不需要添加至哈希表,這樣可以縮小哈希的範圍同時節省內存。合適的排序方法也應該可以提高效率。

具體實現待更 …

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章