寫在前邊:
小詹一直覺得自己程式設計能力不強,想在網上刷題,又怕不能堅持。不知道有木有和小夥伴和小詹一樣想找個人一起刷題呢?歡迎和小詹一起定期刷leetcode,每週一週五更新一題,每一題都吃透,歡迎一題多解,尋找最優解!歡迎小夥伴們把自己的思路在留言區分享出來噢~
No.1 Two Sum
原題:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
題目大意:給出一個數字列表和一個目標值(target),假設列表中有且僅有兩個數相加等於目標值,我們要做的就是找到這兩個數,並返回他們的索引值。
例如:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
複製程式碼
小詹第一反應就是兩層迴圈就可以解決,小case,的確思路簡單,但是時間複雜度,你懂得!很簡單就能想到的程式碼如下:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
result = []
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
result.append(i)
result.append(j)
return result
複製程式碼
其實這裡也可以用一層迴圈即可實現,因為我們知道有且僅有一個解;我們可以通過判斷target與某一個元素的差值是否也在列表之中即可,這個和兩層迴圈思路類似,但是不難想到計算次數就下降了,程式碼如下:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
result = []
for i in range(len(nums)):
oneNum = nums[i]
twoNum = target - oneNum
if twoNum in nums:
j = nums.index(twoNum)
if i != j:
result.append(i)
result.append(j)
return result
複製程式碼
的確兩種方案都輕鬆通過了,but用時過長,排名老靠後了。之後小詹在網上找到了另一種方案,整體思路和一層迴圈的方案二有點類似:通過建立字典,將nums裡的值和序號對應起來,並建立另一個字典儲存目標值(Target)-nums的值,通過判斷該值是否在nums內進行判斷並返回其對應索引值,程式碼如下:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
# 建立字典一,儲存輸入列表的元素值和對應索引
num_dict = {nums[i]:i for i in range(len(nums))}
print(num_dict)
# 建立另一個字典,儲存target-列表中的元素的值,小詹稱為num_r吧,好表達
num_dict2 = {i:target-nums[i] for i in range(len(nums))}
print(num_dict2)
# 判斷num_r是否是輸入列表中的元素,如果是返回索引值,不是則往下進行
result = []
for i in range(len(nums)):
j = num_dict.get(num_dict2.get(i))
if (j is not None) and (j!=i):
result = [i,j]
break
return result
複製程式碼
該方案,在時間效率上還較為理想,小詹親測結果排名如下:
不知道小夥伴們能否提出更加節約時間的方案呢?如果有請聯絡小詹,在下一次打卡時候分享給大家!獨樂樂不如眾樂樂噢!
往期推薦
歡迎關注公眾號【小詹學python】,和我一起學習噢