[100天每天一個算法--第10天] 求兩數之和

問題描述如下:
給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法一:暴力求解
直接兩層for循環,遍歷每個元素 x,並查找是否存在一個值與 target - x相等的目標元素
代碼如下:

class Solution(object):
    def twoSum(self, nums, target):
        for i,x in enumerate(nums):
            for e,v in enumerate(nums):
                if v == (target-x) and e != i:
                    list = [i,e]
                    return list

複雜度分析:
時間複雜度:O(n^2) 對於每個元素,通過遍歷數組的其餘部分來尋找它所對應的目標元素,這將耗費 O(n)的時間
空間複雜度:O(1)
方法二:利用python字典
進行迭代並將元素插入到字典中的同時,回過頭來檢查字典中是否已經存在當前元素所對應的目標元素。如果它存在,那我們已經找到了對應解,並立即將其返回

class Solution(object):
    def twoSum(self, nums, target):
        tmpdict = {}
        for x in range(len(nums)):
            if tmpdict.has_key(target-nums[x]):
                return [tmpdict[target-nums[x]],x]
            tmpdict[nums[x]] = x

複雜度分析:
時間複雜度:O(n), 我們只遍歷了包含有 n 個元素的列表一次。在字典中進行的每次查找只花費 O(1) 的時間。
空間複雜度:O(n), 所需的額外空間取決於字典中存儲的元素數量,該字典最多需要存儲 n 個元素。

驗證:
輸入: [2,7,11,15] 9
輸出:[0,1]

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