剛開始接觸演算法方面,好多都不懂,打算每刷一題就整理一下
給定乙個整數數列,找出其中和為特定值的那兩個數。
你可以假設每個輸入都只會有一種答案,同樣的元素不能被重用。
示例:
給定 nums = [2, 7, 11, 15], target = 9解法一:.剛開始看到的的時候,第乙個想到的就是用乙個巢狀迴圈把nums列表遍歷兩次,雖然測試通過了但是耗時實在太長了,然後就考慮了其他時間複雜度低的方法因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
**如下:
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
解法二:用乙個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
解法三:這個解法是我看了排名前幾個的答案後才知道的, 先建立乙個空字典,然後依次把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]進行對比
1 兩數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 解class solution hash nums i...
1 兩數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 由於元素不能重複利用,所以使用j i 1,通過雙迴圈,...
1 兩數之和
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。public int twosum int nums,int target throw new illegalargumentexception no two sum solution 這樣的時間複雜度為0 nlogn 但是通過檢視官方的...