大家好,又見面了,我是你們的朋友全棧君。
給定一個整數數列,找出其中和為特定值的那兩個數。
你可以假設每個輸入都只會有一種答案,同樣的元素不能被重用。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法一:.剛開始看到的的時候,第一個想到的就是用一個嵌套循環把nums列表遍歷兩次,雖然測試通過了但是耗時實在太長了,然後就考慮了其他時間復雜度低的方法
代碼如下:
class Solution:
def twoSum(self,nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
#用len()方法取得nums列表的長度
n = len(nums)
#x取值從0一直到n(不包括n)
for x in range(n):
#y取值從x+1一直到n(不包括n)
#用x+1是減少不必要的循環,y的取值肯定是比x大
for y in range(x+1,n):
#假如 target-nums[x]的某個值存在於nums中
if nums[y] == target - nums[x]:
#返回x和y
return x,y
break
else:
continue
解法二:用一個for循環,直接在裡面查詢target-nums[x]是否存在於nums列表中,速度比解法一快了許多,但還是不夠
代碼如下:
class Solution:
def twoSum(self,nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
#用len()方法取得nums列表長度
n = len(nums)
#x從0到n取值(不包括n)
for x in range(n):
a = target - nums[x]
#用in關鍵字查詢nums列表中是否有a
if a in nums:
#用index函數取得a的值在nums列表中的索引
y = nums.index(a)
#假如x=y,那麼就跳過,否則返回x,y
if x == y:
continue
else:
return x,y
break
else :
continue
解法三:這個解法是我看了排名前幾個的答案後才知道的, 先創建一個空字典,然後依次把target-nums[x]的值存入字典,存入一個就跟nums[x+1]去比較, 字典中的key為target-nums[x],value為x,也就是nums[x]在nums列表中的索引位置。當字典d中有nums[x+1]時,也就是target – nums[y] = nums[x+1] , y肯定是小於x+1的(因為y是x+1之前循環過的數字)
所以是 return y,x+1
class Solution:
def twoSum(self,nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
#用len()方法取得nums列表長度
n = len(nums)
#創建一個空字典
d = {}
for x in range(n):
a = target - nums[x]
#字典d中存在nums[x]時
if nums[x] in d:
return d[nums[x]],x
#否則往字典增加鍵/值對
else:
d[a] = x
#邊往字典增加鍵/值對,邊與nums[x]進行對比
發布者:全棧程序員棧長,轉載請注明出處:https://javaforall.cn/133633.html原文鏈接:https://javaforall.cn