起床時間:0500
從最簡單的Two Sum開刷!
Given an array of integers nums and an integer target, return the indices i and j such that nums[i] + nums[j] == target and i != j.
You may assume that every input has exactly one pair of indices i and j that satisfy the condition.
Return the answer with the smaller index first.
暴力解兩層 for 迴圈搞定!
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:
return [i, j]
return []
我一直覺得,外層要寫range(len(nums))-1。但其實沒差
因為當 i == len(nums)-1 時,內層變成:for j in range(len(nums), len(nums)): # 空的 range,不會進去
所以不會出錯,只是外層最後一圈「多跑一次但內層不進去」而已(微小的額外迭代,時間複雜度仍是 O(n²))。
可以把外層少一圈,這樣最後一個 i 就不跑了(因為它後面已經沒有元素可配):
for i in range(len(nums) - 1): # i = 0 .. len(nums)-2
for j in range(i + 1, len(nums)): # j = i+1 .. len(nums)-1
...
兩種寫法在正確性上完全等價;第二種只是省去外層最後那次「空轉」。差異是微型優化(micro-optimization)與個人口味(readability)。
太久沒有寫python,語法不太熟練。暴力解會用到for ... in ...
for 會逐一迭代(iterate)一個可迭代物件(iterable),例如 list、str、range。
for x in [10, 20, 30]: # 依序把 10,20,30 指給 x
print(x)
range 會產生一個整數序列(integer sequence),是惰性(lazy)的序列型(sequence-like)物件(記憶體 O(1))。
三種寫法(syntax):
list(range(5)) # [0, 1, 2, 3, 4]
list(range(2, 5)) # [2, 3, 4]
list(range(10, 0, -2)) # [10, 8, 6, 4, 2]
list(range(5, 2)) # [],方向不對 -> 空