1. 程式人生 > >LeetCode 1. Two Sum 兩數之和

LeetCode 1. Two Sum 兩數之和

LeetCode 1. Two Sum 兩數之和

標籤: Leetcode


題目描述

給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的兩個整數。

你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。

示例:

給定 nums = [2, 11, 7, 15], target = 9

因為 nums[0] + nums[2] = 2 + 7 = 9
所以返回 [0, 2]

解題思路

1.暴力法

使用兩層for迴圈,找出兩個和為target的元素,然後記錄其位置返回即可,但是在LeetCode中使用python可能會出現超時的線現象,所以 O

( n 2 ) O(n^2) 時間複雜度不能完成該任務。所以可以考慮空間換時間。

2.雜湊表

2.1 雜湊表思想

可以考慮使用一個雜湊表(可以用python中字典表示)記錄你訪問過的元素,比如第一次你訪問的是2(位置是0),那麼你可以在字典中新增一條記錄:{“target-nums[0]”:0},之所以字典的value用位置是因為最終結果要的是兩個位置,字典的key用target-nums[0]的原因是我們記錄下當前元素,以及當前元素需要配對的元素,這樣我們在遍歷陣列的時候,每次檢查一下遍歷到的元素是不是在字典中(key),如果在字典中那麼說明之前我們遍歷到了一個需要當前元素配對的元素,並且字典中也儲存了那個元素的位置,所以成功得到結果。

2.2 舉個栗子

初始情況:

nums 2 11 7 15

target = 9
d ={ }

i d
0 {7:0}(其中 7 = target - nums[0])說明2需要一個7配對
1 {7:0,-2:1} 說明11需要一個-2配對
2 {7:0,-2:1} 因為7在字典的key中,說明7之前被0位置的元素需要了,所以得到結果,返回[d[“7”],2]

3.python程式碼實現

class Solution():
    def twoSum(self, nums, target):
        d = {}
        # enumerate(nums)返回一個元組(位置,值)
        for i, v in enumerate(nums):
            if v in d:
                return [d[v], i]
            d[target - v] = i