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 使用暴力破解,雙重迴圈進行尋找兩遍,每乙個資料都被遍歷過,如下圖 所示,第一層遍歷找到剩...