這題給我的教訓太深了 , 如果一道題相對太難太複雜 , 沒有完整的思路 , 千萬千萬千萬不要用過程化的方式寫虛擬碼 ,這樣是一直在滿足特殊情況的修修補補,最後寫出一堆垃圾程式碼只能刪掉 , 先放寬條件 , 解決簡單的問題 , 再一步步思考
還有, 這種題要先畫圖 別做跳過去直接寫虛擬碼的蠢事
how to solve it 應該是本很好的書 , 做裡面的題 ? 這本做完以後感覺可以去當老師了XD
暗時間裡提到的其他書也可以看下
func pathSum(root *TreeNode, sum int) int {
if root==nil {
return 0
}
res:=0
res+=findPath(root,sum)
if root.Left!=nil {
res+=pathSum(root.Left,sum)
}
if root.Right!=nil {
res+=pathSum(root.Right,sum)
}
return res
}
func findPath(node *TreeNode, sum int) int {
if node==nil {
return 0
}
res:=0
if sum-node.Val==0 {
res+=1
}
res+=findPath(node.Left,sum-node.Val)
res+=findPath(node.Right,sum-node.Val)
return res
}
pathSum(node,sum) {
if node nil {
return 0
}
res=0
res+=findPath(node,sum)
if left
res+=pathSum(left,sum)
if right
res+=pathSum(right,sum)
return res
}
findPath(node,sum) {
if node nil {
return 0
}
res=0
if sum-node.v==0 {
res+=1
}
res+=findPath(node,sum-node.v)
return res
}
錯誤的過程化思考方式
global res=0
findPathsIn(node,sum) {
if sum-node.v==0 {
res++
return
}
if sum-node.v<0 {
if node has left child {
findPathsIn(node.left,sum)
}
if node has right child {
findPathsIn(node.right,sum)
}
return
}
if sum-node.v>0 {
if node has left child {
findPathsIn(node.left,sum-node.v)
}
if node has right child {
findPathsIn(node.right,sum-node.v)
}
return
}
}
寫出來的垃圾程式碼
本作品採用《CC 協議》,轉載必須註明作者和本文連結