第一道題:
給定一棵二叉樹,在二叉樹的全部路徑中找到路徑上結點之和爲題目給定值的子路徑。路徑不必定以根節點爲開頭,也不必定以葉節點爲結尾。而且根據分析路徑之間應該能夠重疊。求出知足這樣要求的路徑的數目,並返回。node
10 / \ 5 -3 / \ \ 3 2 11 / \ \ 3 -2 1 當給出以上的二叉樹,並以8爲路徑節點和時,5->3,5->2->1,-3->11三條路徑知足條件返回三。
對於根節點來說,知足條件的路徑,包括以根節點爲起點的路徑,以及不以根節點爲起點的路徑。
咱們先定義一個函數,這個函數有兩個節點node和sum,它的含義是,求出從node開始的,路徑上各節點之和爲sum的這樣的路徑的個數。注意是從node開始的。算法
result初始化爲0。若是當前node的value等於sum,則將result加1。因爲可能會有負數節點,所以不能馬上返回result,應該分別再遞歸的去計算以node的左孩子和右孩子爲起點,和爲sum-node.value的路徑的數目。
代碼以下:app
def path_num_from(self, node, sum): if node is None: return 0 res = 0 if node.val == sum: res += 1 res += self.path_num_from(node.left, sum - node.val) res += self.path_num_from(node.right, sum - node.val) return res
以前已經提到過,本題所求的路徑不只包含以根節點爲起點的路徑,還包含不以根節點爲起點的路徑。所以咱們再定義一個函數,來算出,包含根節點的路徑,和不包含根節點的路徑。函數
def __pathSum(self, node, sum): if node is None: return 0 return self.find_path(node, sum) + self.__pathSum(node.left, sum) + self.__pathSum(node.right, sum)
題目得解。code
第二道題:
給定一個數,將其拆分爲n個平方數的和,求最小的n。
例如13 = 9 + 4 13 = 9 + 1 + 1 + 1 + 1
13是9和4兩個平方數的和,也是9和4個1的和(若是用重複,按出現的次數計數,1計數4次而不是1次),由於2小於5,因此返回2。遞歸
這道題不能用貪心算法求解。
當n=12時,若是用貪心算法,結果就是9+1+1+1,返回4。可是更優的解是4+4+4,返回3。隊列
假設給出的數字爲n。先創建一個set。set中存放全部的,小於n的平方數。
好比給出數字13時,set中添加1,4,9。由於16大於13,因此不添加。
以15舉例。set爲 1,4,9。創建一個隊列。二叉樹
第一輪:
15減去9,獲得6。將6放入隊列中。
15減去4,獲得11。將11放入隊列中。
15減去1,獲得14,將14放入隊列中。
第一輪遍歷完畢。此時隊列中還有6,11,14循環
第二輪:
6比9小,因此不能再減9。
6減4,獲得2,將2放入隊列中。
6減1,獲得5,將5放入隊列中。
11減9,獲得2,將2放入隊列中。
11減4,獲得7,將7放入隊列中。
11減1,獲得10,將10放入隊列中。
第二輪遍歷完畢。去掉重複的數,此時隊列中還有2,5,7,10。遍歷
第三輪:
2減1,獲得1,將1放入隊列中。
5減4,獲得1,將1放入隊列中。
5減1,獲得4,將4放入隊列中。
7減4,獲得3,將3放入隊列中。
7減1,獲得6,將6放入隊列中。
10減4,獲得6,將6放入隊列中。
10減1,獲得9,將9放入隊列中。
第三輪遍歷完畢。去掉重複元素,此時隊列中還有1,3,4,6,9。
第四輪:
1減1,獲得0。結束循環。直接返回此時層數。因爲遍歷了四輪,所以返回4。
代碼以下:
def numSquares(self, n): nums_to_subtract = [] i = 1 while i**2 <= n: nums_to_subtract.append(i**2) i += 1 depth = 0 current_level_nodes = {n} while True: nodes = current_level_nodes current_level_nodes = set() depth += 1 for num_left in nodes: for num in nums_to_subtract: if num_left < num: break elif num_left > num: current_level_nodes.add(num_left - num) else: return depth