如果很好說出finalize用法,面試官會認為你很資深
阿新 • • 發佈:2021-01-18
1.兩數之和
- 簡單
給定一個整數陣列 nums
和一個整數目標值 target
,請你在該陣列中找出 和為目標值
的那 兩個
整數,並返回它們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
你可以按任意順序返回答案。
示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
輸入:nums = [3,2,4], target = 6
輸出:[1,2]
示例 3:
輸入:nums = [3,3], target = 6 輸出:[0,1]
提示:
- 2 <= nums.length <= 103
- -109 <= nums[i] <= 109
- -109 <= target <= 109
- 只會存在一個有效答案
方法一
解題思路:
就是從第一個元素開始依次挨個和後面的元素進行和運算,來查詢和為目標數的兩個數。第一個沒有就再拿第二個,第三個,直至所有元素都已組合過。這就需要進行兩層迴圈。
程式碼
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
res = []
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
res.extend([i, j])
break
return res
結果:
分析:
果然兩層迴圈的暴力列舉是佔用記憶體很大的。
-
時間複雜度:O(N^2),其中 N 是陣列中的元素數量。最壞情況下陣列中任意兩個數都要被匹配一次。
-
空間複雜度:O(1)
方法二
解題思路:
程式碼
class Solution:
def twoSum1(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
res = []
for i in range(n):
k = target - nums[i]
if k in nums:
ind = nums.index(k)
if i == ind:
continue
else:
res.append(i)
res.append(ind)
break
return res
if __name__ == '__main__':
solu = Solution()
a = solu.twoSum1([3, 3], 6)
print(a)
結果:
分析:
一次迴圈一下子就將時間降下來了。
-
時間複雜度:O(N)
-
空間複雜度:O(1)
方法三
解題思路:
參考了大神們的解法,通過雜湊來求解,這裡通過字典來模擬雜湊查詢的過程。
程式碼:
class Solution:
def twoSum3(self, nums: List[int], target: int) -> List[int]:
hashmap = {}
for i, num in enumerate(nums):
if hashmap.get(target - num) is not None:
return [i, hashmap.get(target - num)]
hashmap[num] = i # 這句不能放在if語句之前,解決list中有重複值或target-num=num的情況
if __name__ == '__main__':
solu = Solution()
a = solu.twoSum3([3, 3], 6)
print(a)
結果:
分析:
這個結果也是快的,只是從另一個角度來解決問題。