if pRoot1 and pRoot2: if pRoot1.val == pRoot2.val: result = self.JudgeSubTree(pRoot1.left, pRoot2.left) and self.JudgeSubTree(pRoot1.right, pRoot2.right) if not result: result = self.HasSubtree(pRoot1.left, pRoot2) if not result: result = self.HasSubtree(pRoot1.right, pRoot2)
# 满足条件 isLeaf = root.left == None and root.right == None if currentNumber == expectNumber and isLeaf: self.result.append([p.val for p in path]) # for i in path: # print(i.val,end=' ')
if root.left: self.find_path(root.left, expectNumber, path, currentNumber) if root.right: self.find_path(root.right, expectNumber, path, currentNumber) path.pop()
# 处理左子树(处理右子树类似) self.Convert(pRootOfTree.left) left = pRootOfTree.left # 连接根与左子树最大结点 if left: while left.right: left = left.right pRootOfTree.left = left left.right = pRootOfTree
day27 字符串的排列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
def helper(self, array, solution): if len(array) == 0: print(solution) return for i in range(len(array)): new_solution = solution + [array[i]] # 新建排序列表 new_array = array[:i] + array[i+1:] # 新建待选择列表 self.helper(new_array, new_solution) # 回溯 # 组合 def helper(self, array, solution, n): if len(solution) == n: print(solution) return for i in range(len(array)): new_solution = solution + [array[i]] # 新建组合列表 new_array = array[i+1:] # 新建待选择列表表 self.helper(new_array, new_solution, n) # 回溯
day29_最小的K个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
解法3:创建一个大小为k的数据容器来存储最小的k个数字,接下来每次从输入的n个整数中读入一个数。如果容器中 已有的数字少于k个数,则直接把这次读入的整数放入容器中,如果容器中已有k个数字,即容器已满,此时我们不能再 插入新的数字而只能替换已有的数字。而是找出这已有的k个数中的最大值,然后拿这次待插入的整数和最大值进行比较。 如果待插入的值比当前已有的最大值还要大,则替换掉当前的最大值。 def GetLeastNumbers_Solution2(self, tinput, k): vec = tinput[:k] max_index = self.find_max(vec) for x in tinput[k:]: if x < vec[max_index]: vec[max_index] = x max_index = self.find_max(vec) return vec
# 思路:分析数组的规律 def FindGreatestSumOfSubArray(self, array): if not array or not isinstance(array, list): return 0 cur_sum = 0 cur_great = -float('inf') for num in array: if cur_sum <= 0: cur_sum = num else: cur_sum += num if cur_sum > cur_great: cur_great = cur_sum return cur_great
"""题目描述 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 """ """解题思路: 1.利用内置函数sum和range即可快速实现。 2.利用逻辑与的短路特性实现递归终止: # “and”运算符表示“与”,前一项为假则整个表达式为假,因此可以利用这个性质进行递归运算 class Solution: def Sum_Solution(self, n): result = n temp = n > 0 and self.Sum_Solution(n-1) result += temp return result
解题思路: a / \ b c / \ / \ d e f g / \ h i 上图中这棵二叉树的中序遍历(左根右)是d,b,h,e,i,a,f,c,g,我们以此为例进行分析。 1)如果一个结点有右子树,那么它的下一个结点就是它的右子树中的最左子结点。也就是说从 右结点出发一直沿着指向左指针的结点就能找到它的下一个结点。 2)如果一个结点没有右子树,且它是它父结点的左子树,那么它的下一个结点就是它的父结点。 3)如果一个结点既没有右子树,并且它还是它父结点的右子结点,这种情况相对复杂,我们可以 沿着指向父结点的指针一直向上遍历,直到找到一个是它父结点的左子结点的结点。如果这样的结 点存在,那么这个节点的父结点就是我们要找的下一个结点。