Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 3e79203

Browse files
committed
add new solution
1 parent 8cdb2ed commit 3e79203

8 files changed

+525
-2
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:
2+
#
3+
#
4+
#
5+
# BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出
6+
# 。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。
7+
# boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。
8+
# int next()将指针向右移动,然后返回指针处的数字。
9+
#
10+
#
11+
# 注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。
12+
#
13+
#
14+
#
15+
# 你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。
16+
#
17+
#
18+
#
19+
# 示例:
20+
#
21+
#
22+
# 输入
23+
# ["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext
24+
# ", "next", "hasNext"]
25+
# [[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
26+
# 输出
27+
# [null, 3, 7, true, 9, true, 15, true, 20, false]
28+
#
29+
# 解释
30+
# BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
31+
# bSTIterator.next(); // 返回 3
32+
# bSTIterator.next(); // 返回 7
33+
# bSTIterator.hasNext(); // 返回 True
34+
# bSTIterator.next(); // 返回 9
35+
# bSTIterator.hasNext(); // 返回 True
36+
# bSTIterator.next(); // 返回 15
37+
# bSTIterator.hasNext(); // 返回 True
38+
# bSTIterator.next(); // 返回 20
39+
# bSTIterator.hasNext(); // 返回 False
40+
#
41+
#
42+
#
43+
#
44+
# 提示:
45+
#
46+
#
47+
# 树中节点的数目在范围 [1, 105] 内
48+
# 0 <= Node.val <= 106
49+
# 最多调用 105 次 hasNext 和 next 操作
50+
#
51+
#
52+
#
53+
#
54+
# 进阶:
55+
#
56+
#
57+
# 你可以设计一个满足下述条件的解决方案吗?next() 和 hasNext() 操作均摊时间复杂度为 O(1) ,并使用 O(h) 内存。其中 h 是树的高
58+
# 度。
59+
#
60+
# Related Topics 栈 树 设计 二叉搜索树 二叉树 迭代器
61+
# 👍 620 👎 0
62+
63+
64+
# leetcode submit region begin(Prohibit modification and deletion)
65+
# Definition for a binary tree node.
66+
# class TreeNode:
67+
# def __init__(self, val=0, left=None, right=None):
68+
# self.val = val
69+
# self.left = left
70+
# self.right = right
71+
class BSTIterator:
72+
73+
def __init__(self, root: TreeNode):
74+
self.root = root
75+
self.stack = []
76+
while self.root:
77+
self.stack.append(self.root)
78+
self.root = self.root.left
79+
80+
def next(self) -> int:
81+
node = self.stack.pop()
82+
root = node.right
83+
while root:
84+
self.stack.append(root)
85+
root = root.left
86+
return node.val
87+
88+
def hasNext(self) -> bool:
89+
if self.stack:
90+
return True
91+
else:
92+
return False
93+
94+
95+
96+
# Your BSTIterator object will be instantiated and called as such:
97+
# obj = BSTIterator(root)
98+
# param_1 = obj.next()
99+
# param_2 = obj.hasNext()
100+
# leetcode submit region end(Prohibit modification and deletion)

script/[437]路径总和 III.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
2+
#
3+
# 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
4+
#
5+
#
6+
#
7+
# 示例 1:
8+
#
9+
#
10+
#
11+
#
12+
# 输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
13+
# 输出:3
14+
# 解释:和等于 8 的路径有 3 条,如图所示。
15+
#
16+
#
17+
# 示例 2:
18+
#
19+
#
20+
# 输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
21+
# 输出:3
22+
#
23+
#
24+
#
25+
#
26+
# 提示:
27+
#
28+
#
29+
# 二叉树的节点个数的范围是 [0,1000]
30+
# -109 <= Node.val <= 109
31+
# -1000 <= targetSum <= 1000
32+
#
33+
# Related Topics 树 深度优先搜索 二叉树
34+
# 👍 1398 👎 0
35+
36+
37+
# leetcode submit region begin(Prohibit modification and deletion)
38+
# Definition for a binary tree node.
39+
# class TreeNode:
40+
# def __init__(self, val=0, left=None, right=None):
41+
# self.val = val
42+
# self.left = left
43+
# self.right = right
44+
class Solution:
45+
def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int:
46+
def helper(root, targetSum):
47+
if not root:
48+
return 0
49+
# 注意这里不要返回因为在node.val可能<0
50+
if targetSum==root.val:
51+
mid =1
52+
else:
53+
mid=0
54+
left = helper(root.left, targetSum-root.val)
55+
right = helper(root.right, targetSum-root.val)
56+
return left + right+mid
57+
58+
def dfs(root, target):
59+
if not root:
60+
return 0
61+
left = dfs(root.left, target)
62+
right = dfs(root.right, target)
63+
mid = helper(root, target)
64+
return left+right+mid
65+
return dfs(root, targetSum)
66+
67+
68+
# leetcode submit region end(Prohibit modification and deletion)
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# 给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。
2+
#
3+
# 注意,根节点 root 位于深度 1 。
4+
#
5+
# 加法规则如下:
6+
#
7+
#
8+
# 给定整数 depth,对于深度为 depth - 1 的每个非空树节点 cur ,创建两个值为 val 的树节点作为 cur 的左子树根和右子树根。
9+
# cur 原来的左子树应该是新的左子树根的左子树。
10+
# cur 原来的右子树应该是新的右子树根的右子树。
11+
# 如果 depth == 1 意味着 depth - 1 根本没有深度,那么创建一个树节点,值 val 作为整个原始树的新根,而原始树就是新根的左子树。
12+
#
13+
#
14+
#
15+
#
16+
# 示例 1:
17+
#
18+
#
19+
#
20+
#
21+
# 输入: root = [4,2,6,3,1,5], val = 1,
22+
#
23+
# depth = 2
24+
# 输出: [4,1,1,2,null,null,6,3,1,5]
25+
#
26+
# 示例 2:
27+
#
28+
#
29+
#
30+
#
31+
# 输入: root = [4,2,null,3,1], val = 1, depth = 3
32+
# 输出: [4,2,null,1,1,3,null,null,1]
33+
#
34+
#
35+
#
36+
#
37+
# 提示:
38+
#
39+
#
40+
# 节点数在 [1, 104] 范围内
41+
# 树的深度在 [1, 104]范围内
42+
# -100 <= Node.val <= 100
43+
# -105 <= val <= 105
44+
# 1 <= depth <= the depth of tree + 1
45+
#
46+
# Related Topics 树 深度优先搜索 广度优先搜索 二叉树
47+
# 👍 122 👎 0
48+
49+
50+
# leetcode submit region begin(Prohibit modification and deletion)
51+
# Definition for a binary tree node.
52+
# class TreeNode:
53+
# def __init__(self, val=0, left=None, right=None):
54+
# self.val = val
55+
# self.left = left
56+
# self.right = right
57+
class Solution:
58+
def addOneRow(self, root: TreeNode, val: int, depth: int) -> TreeNode:
59+
def dfs(root, depth):
60+
if not root:
61+
return None
62+
if depth ==1:
63+
node = TreeNode(val)
64+
node.left =root
65+
return node
66+
if depth==2:
67+
left =TreeNode(val)
68+
right = TreeNode(val)
69+
left.left = root.left
70+
right.right = root.right
71+
root.left = left
72+
root.right = right
73+
return root
74+
root.left = dfs(root.left, depth-1)
75+
root.right = dfs(root.right, depth-1)
76+
return root
77+
return dfs(root, depth )
78+
79+
# leetcode submit region end(Prohibit modification and deletion)

script/[62]不同路径.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
2+
#
3+
# 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
4+
#
5+
# 问总共有多少条不同的路径?
6+
#
7+
#
8+
#
9+
# 示例 1:
10+
#
11+
#
12+
# 输入:m = 3, n = 7
13+
# 输出:28
14+
#
15+
# 示例 2:
16+
#
17+
#
18+
# 输入:m = 3, n = 2
19+
# 输出:3
20+
# 解释:
21+
# 从左上角开始,总共有 3 条路径可以到达右下角。
22+
# 1. 向右 -> 向下 -> 向下
23+
# 2. 向下 -> 向下 -> 向右
24+
# 3. 向下 -> 向右 -> 向下
25+
#
26+
#
27+
# 示例 3:
28+
#
29+
#
30+
# 输入:m = 7, n = 3
31+
# 输出:28
32+
#
33+
#
34+
# 示例 4:
35+
#
36+
#
37+
# 输入:m = 3, n = 3
38+
# 输出:6
39+
#
40+
#
41+
#
42+
# 提示:
43+
#
44+
#
45+
# 1 <= m, n <= 100
46+
# 题目数据保证答案小于等于 2 * 109
47+
#
48+
# Related Topics 数学 动态规划 组合数学
49+
# 👍 1468 👎 0
50+
51+
52+
# leetcode submit region begin(Prohibit modification and deletion)
53+
class Solution:
54+
def uniquePaths(self, m: int, n: int) -> int:
55+
dp = [[0] *n for i in range(m)]
56+
for i in range(n):
57+
dp[0][i] =1
58+
for i in range(m):
59+
dp[i][0] =1
60+
for i in range(1,m):
61+
for j in range(1,n):
62+
dp[i][j] = dp[i-1][j] + dp[i][j-1]
63+
return dp[-1][-1]
64+
# leetcode submit region end(Prohibit modification and deletion)

script/[63]不同路径 II.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
2+
#
3+
# 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
4+
#
5+
# 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
6+
#
7+
# 网格中的障碍物和空位置分别用 1 和 0 来表示。
8+
#
9+
#
10+
#
11+
# 示例 1:
12+
#
13+
#
14+
# 输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
15+
# 输出:2
16+
# 解释:3x3 网格的正中间有一个障碍物。
17+
# 从左上角到右下角一共有 2 条不同的路径:
18+
# 1. 向右 -> 向右 -> 向下 -> 向下
19+
# 2. 向下 -> 向下 -> 向右 -> 向右
20+
#
21+
#
22+
# 示例 2:
23+
#
24+
#
25+
# 输入:obstacleGrid = [[0,1],[0,0]]
26+
# 输出:1
27+
#
28+
#
29+
#
30+
#
31+
# 提示:
32+
#
33+
#
34+
# m == obstacleGrid.length
35+
# n == obstacleGrid[i].length
36+
# 1 <= m, n <= 100
37+
# obstacleGrid[i][j] 为 0 或 1
38+
#
39+
# Related Topics 数组 动态规划 矩阵
40+
# 👍 838 👎 0
41+
42+
43+
# leetcode submit region begin(Prohibit modification and deletion)
44+
class Solution:
45+
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
46+
m = len(obstacleGrid)
47+
n = len(obstacleGrid[0])
48+
dp = [[0] *n for i in range(m)]
49+
for i in range(n):
50+
if obstacleGrid[0][i]==1:
51+
break
52+
dp[0][i] =1
53+
for i in range(m):
54+
if obstacleGrid[i][0]==1:
55+
break
56+
dp[i][0] =1
57+
for i in range(1,m):
58+
for j in range(1,n):
59+
if obstacleGrid[i][j]==1:
60+
continue
61+
dp[i][j] = dp[i-1][j] + dp[i][j-1]
62+
return dp[-1][-1]
63+
# leetcode submit region end(Prohibit modification and deletion)

0 commit comments

Comments
 (0)