Leetcode系列之兩數之和

2022-04-10 16:52:51 字數 2492 閱讀 7596

python實現(三種方法)

class

solution

(object):

@staticmethod

deftwo_sum_1

(nums: list, target: int):

"""方法一"""

for index1, num1 in enumerate(nums):

num2 = target - num1

if num2 in nums and nums.index(target - num1) != index1:

return [index1, nums.index(target - num1)]

@staticmethod

deftwo_sum_2

(nums: list, target: int):

"""方法二"""

num_dict = {}

for index, num in enumerate(nums):

num_dict[num] = index

for i, num in enumerate(nums):

j = num_dict.get(target - num)

if j and i != j:

return [i, j]

@staticmethod

deftwo_sum_3

(nums: list, target: int):

"""方法三"""

num_dict = {}

for index, num in enumerate(nums):

if target - num in num_dict:

return [num_dict[target - num], index]

num_dict[num] = index

go語言實現

package main

import

"fmt"

func

twosum

(nums int, target int) int

target := 9

ret := twosum(nums, target)

fmt.println(ret)

}

方法

執行用時

記憶體消耗

語言python1

1168 ms

14.9 mb

python3

python2

68 ms

15.4 mb

python3

python3

68 ms

15 mb

python3

go4 ms

3.7 mb

golang

從執行結果可以看到,go語言的執行速度最快,記憶體消耗最少,執行速度和記憶體消耗明顯有自身的優勢。而python實現的三種方法中,方法一的時間複雜度為o(n2),列表迴圈時間複雜度為o(n),每一次迴圈內都會進行一次判斷

if num2 in nums and nums.index(target - num1) != index1:

in 列表查詢的時間複雜度為o(n),因此整體時間複雜度為o(n2).方法二和方法三的時間複雜度為o(n),有人也許會說方法二和三的for迴圈中查詢不是也要花費時間嗎?我們帶著問題去看一下方法二:

"""方法二"""

num_dict = {}

for index, num in enumerate(nums):

num_dict[num] = index

for i, num in enumerate(nums):

j = num_dict.get(target - num)

if j and i != j:

return [i, j]

兩個for迴圈為o(n),字典賦值為o(1),字典查詢為o(1)因此,整體時間複雜度為o(n)。

"""方法三"""

num_dict = {}

for index, num in enumerate(nums):

if target - num in num_dict:

return [num_dict[target - num], index]

num_dict[num] = index

方法三種in 字典時間複雜度為o(1),我們注意到這和方法一in 列表的o(n2)不同,字典查詢確實比列表查詢的效率高。

總結:不同語言之間的效能差異確實很大,尤其對於python和go而言。go的效能確實無可挑剔,堪比c。但同時同乙個題,同一種演算法,python實現起來確實比較清爽,節省的時間、精力確實是python的優勢,可以讓人專注於程式的設計與思考,而不是各種複雜語法的實現。當然,不同語言各有優劣,社會需要什麼,我們就去學什麼,這才是王道!

LeetCode系列 1 兩數之和

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...

LeetCode系列 1 兩數之和

描述 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...

leetCode 系列 1 兩數之和

描述 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。1 使用暴力破解,雙重迴圈進行尋找兩遍,每乙個資料都被遍歷過,如下圖 所示,第一層遍歷找到剩...