玩了一下leetcode陕见,做最簡單的two sum問題(https://leetcode.com/problems/two-sum/ )寂纪。
首先上來用了簡單粗暴的for循環(huán)玷坠,還用了兩次寞射。雖然正確算出結(jié)果,卻用了6400ms的時(shí)間(大部分答案的運(yùn)算時(shí)間在幾十毫秒)豫柬。
# first try
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i]+nums[j] == target:
result = [i,j]
break
return result
后來嘗試用library告希,先把list整個(gè)轉(zhuǎn)化成library,再做一些算法運(yùn)算烧给。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dictA = {k: v for v, k in enumerate(nums)}
for i, el in enumerate(nums):
dictA.pop(nums[i])
if target-nums[i] in dictA.keys():
result=[i,dictA[target-nums[i]]]
else:
print(dictA)
return result
這種算法在input列表里有重復(fù)元素是會出現(xiàn)Runtime Error燕偶,應(yīng)該array是整體轉(zhuǎn)化成dict之后,有重復(fù)元素础嫡,在for loop里pop或del后便會報(bào)錯(cuò)指么。
后來朋友提醒我酝惧,何必一開始就全部轉(zhuǎn)化呢?如果前兩個(gè)元素就符合要求的話伯诬,全部轉(zhuǎn)化之后再計(jì)算會耗費(fèi)更多的資源晚唇。
于是有了后來這個(gè)算法,運(yùn)算時(shí)間32ms:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dictA = {}
for i in range(len(nums)):
if target-nums[i] in dictA.keys():
result=[dictA[target-nums[i]],i]
return result
break
else:
dictA.update({nums[i]:i})