Leetcode Ruby Practice(2)
Leetcode 111 review. 這題在找最淺的葉子深度
What I learnt: 學習不要用depth當參數去傳,練習用return值一層層疊加來表示depth
再來一個不太懂的部分(下方有更新) 比較兩段ruby code
1. Runtime: 98ms
def traverse(node)
big_num = 100000
if node == nil
return 0
end
if node.left
left = traverse(node.left) + 1
else
left = big_num
end
if node.right
right = traverse(node.right) + 1
else
right = big_num
end
if is_leaf(node)
return 1
end
return [left, right].min
end
def is_leaf(node)
node.left == nil && node.right == nil ? true : false
end
2. Runtime: 56ms
def traverse(node)
if node == nil
return 0
end
if node.left
left = traverse(node.left) + 1
else
left = 100000
end
if node.right
right = traverse(node.right) + 1
else
right = 100000
end
if node.left == nil && node.right == nil
return 1
end
return [left, right].min
end
兩種寫法差在把leaf的判斷多開一個function與否 沒想到多寫一個function執行時間差了一倍 目前的想法是:每個node都會用到這個判斷,而function的堆疊很貴,所以runtime差很多 但我不確定:
- 很貴是多貴?
- 每個語言都這樣?
- Ruby對function的處理是如何?
- 其實我連c對function實際上的處理都忘了(Heap啥的都忘了)
更新: 看了看覺得自己code 寫太醜,把code 改了一下。 簡短一些if else 讓code短一點,這樣在blog上看比較抓得到重點, 原本想要把上面的code抽換掉,但沒想到改完後:
Runtime: 55ms
def traverse(node)
return 0 if node == nil
left = node.left ? traverse(node.left) + 1 : 100000
right = node.right ? traverse(node.right) + 1 : 100000
return 1 if node.left == nil && node.right == nil
return [left, right].min
end
再多測了幾次,發現每段時間都有機會跑長跑短:
- Easy的題目本來就不會花太多時間,可能只是server loading的問題
- 所以以後寫Easy,runtime很短不用太高興
- 現階段好好參考別人ruby怎麼寫就好,學習思路
另外紀錄一下一個看起來很clean很潮的寫法:
def min_depth(root)
return 0 if root == nil
return 1 if root.left == nil && root.right == nil
return 1 + min_depth(root.left) if root.left != nil && root.right == nil
return 1 + min_depth(root.right) if root.left == nil && root.right != nil
return [min_depth(root.left), min_depth(root.right)].min + 1
end
留言