1. 程式人生 > >[100天每天一個演算法--第10天] 求兩數之和

[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]