第一道题:
给定一棵二叉树,在二叉树的全部路径中找到路径上结点之和为题目给定值的子路径。路径不必定以根节点为开头,也不必定以叶节点为结尾。而且根据分析路径之间应该能够重叠。求出知足这样要求的路径的数目,并返回。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