iT邦幫忙

2025 iThome 鐵人賽

DAY 1
0
自我挑戰組

每天早起刷一題系列 第 1

[1/30][Easy] Two Sum

  • 分享至 

  • xImage
  •  

起床時間: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)

紀錄

語法 for ... in ...

太久沒有寫python,語法不太熟練。暴力解會用到for ... in ...
for 會逐一迭代(iterate)一個可迭代物件(iterable),例如 list、str、range。

for x in [10, 20, 30]:   # 依序把 10,20,30 指給 x
    print(x)

語法 range()

range 會產生一個整數序列(integer sequence),是惰性(lazy)的序列型(sequence-like)物件(記憶體 O(1))。

三種寫法(syntax):

  • range(stop):從 0 到 stop-1
  • range(start, stop):從 start 到 stop-1
  • range(start, stop, step):每次加上 step(可負數),直到不到 stop 為止
    • start 含(inclusive),stop 不含(exclusive)
    • step 不能是 0(ValueError)
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))       # [],方向不對 -> 空

下一篇
[2/30][Easy] Two Sum - sort solution
系列文
每天早起刷一題7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言