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差很多 但我不確定:

  1. 很貴是多貴?
  2. 每個語言都這樣?
  3. Ruby對function的處理是如何?
  4. 其實我連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

再多測了幾次,發現每段時間都有機會跑長跑短:

  1. Easy的題目本來就不會花太多時間,可能只是server loading的問題
  2. 所以以後寫Easy,runtime很短不用太高興
  3. 現階段好好參考別人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

留言