102
题目描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
# 一提起层次遍历就要想要广搜,想到广搜就要想到队列;
# 就好比深搜一定要想起栈
if root == None:
return []
queue = [root]
ret = []
while queue:
tmp_ret = []
tmp_nodes = []
for node in queue:
tmp_ret.append(node.val)
if node.left:
tmp_nodes.append(node.left)
if node.right:
tmp_nodes.append(node.right)
ret.append(tmp_ret)
queue = tmp_nodes
return ret
115
题目描述:
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)
题目数据保证答案符合 32 位带符号整数范围。
示例:
解答:
class Solution:
def numDistinct(self, s: str, t: str) -> int:
m,n = len(s), len(t)
dp = [[0 for _ in range(n+1)] for _ in range(m+1)] # row=m, col=n
for i in range(m):
dp[i][0] = 1
for i in range(1, m+1):
for j in range(1, n+1):
if j > i: continue
if s[i-1] == t[j-1]:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
else:
dp[i][j] = dp[i-1][j]
return dp[m][n]
剑指offer68-I
题目描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例:
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return None
# 如果当前根值大于两个值,那说明pq都在左子树
if root.val > p.val and root.val > q.val:
return self.lowestCommonAncestor(root.left, p, q)
# 如果当前根值小于两个值,那说明pq都在右子树
elif root.val < p.val and root.val < q.val:
return self.lowestCommonAncestor(root.right, p, q)
# 不然pq肯定是在两边,那说明当前的根就是共同祖先
else:
return root