Reverse Linked List

題目
思路

  1. 因為是 linked list,我們可以使用 curr 當指標,沿著 linked list 的頭往後走,一邊改變 curr.next 的指向,而過程中必須對前一個和下一個都有所掌握,因為 curr 必須指向前一個,然後它本身必須換到下一個
  2. 所以我們會有三個變數:previous, curr, next
  3. currhead 時,previous 會是 None,這兩個可以先設定好。目標是一直改變 curr 的指向,讓 curr 一直走到 linked list 盡頭,變成 None 為止,所以 while 條件就是 當有 curr 的時候就做

Isomorphic Strings

題目
這題看似不難,但第一次的做法錯了,第一次的程式碼如下,想法是用 mapping 組一個新字串 t2,假如跟 t 相同就 return True

Python 3 wrong solution:

1
2
3
4
5
6
7
8
def isIsomorphic(self, s: str, t: str) -> bool:
d = {}
for i in range(len(s)):
d[s[i]] = t[i]
t2 = ''
for c in s:
t2 += d[c]
return t == t2

Binary Number with Alternating Bits

題目

  1. 先想到的是有沒有辦法透過 bitwise operation 來判斷,發現無法
  2. 看相鄰位置有沒有一樣的,最直覺就是用字串來判斷 => 可以利用 Python 的 built-in function bin 來把數字轉為 binary 字串

Python3 solution:

1
2
3
4
5
6
def hasAlternatingBits(self, n: int) -> bool:
b_str = bin(n)[2:] # 去掉前面的 '0b'
for i in range(len(b_str) - 1):
if b_str[i] == b_str[i + 1]:
return False
return True

Single Number

題目

  1. 因為只能用常數的額外空間,且 array 裡的數字除了目標之外都會有個,所以朝 bitwise operation 的方向想
  2. 把 array 裡所有數字接連做 bitwise operation,假如有兩個一樣的數字,他們就會抵銷變為 0,即使不是連著做也一樣,所以最後的結果就是那個落單的數字
    • 可以想像所有數字都用二進位表示由上而下列在一起做計算,不管他們位置怎麼換結果都會一樣 (偶數個 1 會互相抵銷)

Python3 solution:

1
2
3
4
5
def singleNumber(self, nums: List[int]) -> int:
r = 0
for i in nums:
r ^= i
return r

Validate Binary Search Tree

題目
思路

  1. 樹的問題用遞迴來解相對上比較直覺,所以先試試遞迴解
  2. 拆解到最小單位來找 recursive case: 隨機取樹中一個點,判斷它是否 valid
  3. 大部分情況都會有上下限。以左邊的點為例,上限就是父節點的值,下限就是它所在的右子樹的父節點的值,所以這個值必須由上到下一層層傳遞下來。反之,右邊的點的話,就變成上限必須一層層傳遞下來
  4. 因為上下限必須用傳遞的,所以寫一個 function node_valid 接受上下限的參數

Binary Tree Level Order Traversal

題目
思路

  1. 一次一層很直覺想到廣先搜尋 (BFS),所以用 iterative 的做法來解
  2. 一次迴圈處理一層,並把下一層節點放入 stack 繼續在下次迴圈處理
    • stack 也是 list of list, 裡面的每個 list 都是一層節點

Binary Tree Inorder Traversal

題目
思路

  1. Inorder Traversal: 對任意節點來說,順序為 左子樹 -> 自己 -> 右子樹
  2. 可拆解為最小單位動作,即第一點,故使用遞迴

House Robber II

題目
思路

  1. House Robber 很像,只差在房子的排列變成頭尾相連,有沒有辦法把這題拆解,變成能用上第一版 House Robber 的解題方法?譬如把環形變回直排?
  2. 變成環形之後多出來的限制讓我們可以把這題分成以下三種情況:
    1. 搶第一個、不搶最後一個:加入第三種情況,等同於可以視為直排,但只考慮到倒數第二個
    2. 不搶第一個、搶最後一個:加入第三種情況,等同於可以視為直排,但從第二個開始考慮

House Robber

題目
思路

  1. 可以把得出答案的過程拆解為最小可重複步驟,用遞迴來解
  2. Recursive case: 假設 index 為 i,由 index 0 搶到 i 可得的最大收穫為 inner_rob(i)。在位置 i, 可選擇搶或不搶:
    1. 不搶:最大收穫跟前一個點一樣,為 inner_rob(i - 1)
    2. 搶:代表前一個點一定是不搶,所以最大收穫為這個點的 money nums[i] 再加上前前個點的最大收穫 inner_rob(i - 2)
    • 所以 inner_rob(i) 為以上兩種情況取較大的那個

Unique Paths

題目
思路

  1. 每走一步都會是一個 unique path,到終點的路線是由每一步所組成的,所以可以用遞迴的方式來想,最小的可重複動作就是一步,點 (i, j) 到終點的 unique path count 就是 (i + 1, j) 和 (i, j + 1) 的 unique path count 的和

  2. 最小可重複動作 return u_paths(i + 1, j) + u_paths(i, j + 1)

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×