leetcode上兩道題的思考

第一道題:
給定一棵二叉樹,在二叉樹的全部路徑中找到路徑上結點之和爲題目給定值的子路徑。路徑不必定以根節點爲開頭,也不必定以葉節點爲結尾。而且根據分析路徑之間應該能夠重疊。求出知足這樣要求的路徑的數目,並返回。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
相關文章
相關標籤/搜索