Skip to content

Commit 3166181

Browse files
authored
feat: add solutions to lc problem: No.2313 (doocs#1484)
No.2313.Minimum Flips in Binary Tree to Get Result
1 parent 5a40ef8 commit 3166181

File tree

11 files changed

+647
-9
lines changed

11 files changed

+647
-9
lines changed

solution/0800-0899/0849.Maximize Distance to Closest Person/README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@
6161

6262
**方法一:一次遍历**
6363

64-
我们定义两个变量 `first``last` 分别表示第一个人和最后一个人的位置,用变量 `d` 表示两个人之间的最大距离。
64+
我们定义两个变量 $first$$last$ 分别表示第一个人和最后一个人的位置,用变量 $d$ 表示两个人之间的最大距离。
6565

66-
然后遍历数组 `seats`,如果当前位置有人,如果此前 `last` 更新过,说明此前有人,此时更新 $d = \max(d, i - last)$;如果此前 `first` 没有更新过,说明此前没有人,此时更新 `first = i`,然后更新 `last = i`
66+
然后遍历数组 $seats$,如果当前位置有人,如果此前 $last$ 更新过,说明此前有人,此时更新 $d = \max(d, i - last)$;如果此前 $first$ 没有更新过,说明此前没有人,此时更新 $first = i$。接下来更新 $last = i$
6767

6868
最后返回 $\max(first, n - last - 1, d / 2)$ 即可。
6969

70-
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 `seats` 的长度。
70+
时间复杂度 $O(n)$,其中 $n$ 为数组 $seats$ 的长度。空间复杂度 $O(1)$
7171

7272
<!-- tabs:start -->
7373

@@ -186,7 +186,7 @@ function maxDistToClosest(seats: number[]): number {
186186
last = i;
187187
}
188188
}
189-
return Math.max(Math.floor(d / 2), Math.max(first, n - last - 1));
189+
return Math.max(first, n - last - 1, d >> 1);
190190
}
191191
```
192192

solution/0800-0899/0849.Maximize Distance to Closest Person/README_EN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ function maxDistToClosest(seats: number[]): number {
166166
last = i;
167167
}
168168
}
169-
return Math.max(Math.floor(d / 2), Math.max(first, n - last - 1));
169+
return Math.max(first, n - last - 1, d >> 1);
170170
}
171171
```
172172

solution/0800-0899/0849.Maximize Distance to Closest Person/Solution.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ function maxDistToClosest(seats: number[]): number {
1414
last = i;
1515
}
1616
}
17-
return Math.max(Math.floor(d / 2), Math.max(first, n - last - 1));
17+
return Math.max(first, n - last - 1, d >> 1);
1818
}

solution/2300-2399/2313.Minimum Flips in Binary Tree to Get Result/README.md

+229-2
Original file line numberDiff line numberDiff line change
@@ -67,28 +67,255 @@
6767

6868
<!-- 这里可写通用的实现逻辑 -->
6969

70+
**方法一:树形 DP + 分情况讨论**
71+
72+
我们定义一个函数 $dfs(root)$,它的返回值是一个长度为 $2$ 的数组,其中第一个表示将 $root$ 节点的值变成 `false` 所需要的最少翻转次数,第二个表示将 $root$ 节点的值变成 `true` 所需要的最少翻转次数。那么答案为 $dfs(root)[result]$。
73+
74+
函数 $dfs(root)$ 的实现如下:
75+
76+
如果 $root$ 为空,那么返回 $[+\infty, +\infty]$。
77+
78+
否则,我们记 $root$ 的值为 $x$,左子树的返回值为 $l$,右子树的返回值为 $r$,然后分情况讨论:
79+
80+
- 如果 $x \in \{0, 1\}$,那么返回 $[x, x \oplus 1]$。
81+
- 如果 $x = 2$,即布尔运算符是 `OR`,为了使 $root$ 的值为 `false`,我们需要将左右子树的值都变成 `false`,因此返回值的第一个元素为 $l[0] + r[0]$;为了使 $root$ 的值为 `true`,我们需要将左右子树的值中至少有一个变成 `true`,因此返回值的第二个元素为 $\min(l[0] + r[1], l[1] + r[0], l[1] + r[1])$。
82+
- 如果 $x = 3$,即布尔运算符是 `AND`,为了使 $root$ 的值为 `false`,我们需要将左右子树的值中至少有一个变成 `false`,因此返回值的第一个元素为 $\min(l[0] + r[0], l[0] + r[1], l[1] + r[0])$;为了使 $root$ 的值为 `true`,我们需要将左右子树的值都变成 `true`,因此返回值的第二个元素为 $l[1] + r[1]$。
83+
- 如果 $x = 4$,即布尔运算符是 `XOR`,为了使 $root$ 的值为 `false`,我们需要将左右子树的值同为 `false` 或同为 `true`,因此返回值的第一个元素为 $\min(l[0] + r[0], l[1] + r[1])$;为了使 $root$ 的值为 `true`,我们需要将左右子树的值不同,因此返回值的第二个元素为 $\min(l[0] + r[1], l[1] + r[0])$。
84+
- 如果 $x = 5$,即布尔运算符是 `NOT`,为了使 $root$ 的值为 `false`,我们需要将左右子树的值中至少有一个变成 `true`,因此返回值的第一个元素为 $\min(l[1], r[1])$;为了使 $root$ 的值为 `true`,我们需要将左右子树的值中至少有一个变成 `false`,因此返回值的第二个元素为 $\min(l[0], r[0])$。
85+
86+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点数。
87+
7088
<!-- tabs:start -->
7189

7290
### **Python3**
7391

7492
<!-- 这里可写当前语言的特殊实现逻辑 -->
7593

7694
```python
77-
95+
# Definition for a binary tree node.
96+
# class TreeNode:
97+
# def __init__(self, val=0, left=None, right=None):
98+
# self.val = val
99+
# self.left = left
100+
# self.right = right
101+
class Solution:
102+
def minimumFlips(self, root: Optional[TreeNode], result: bool) -> int:
103+
def dfs(root: Optional[TreeNode]) -> (int, int):
104+
if root is None:
105+
return inf, inf
106+
x = root.val
107+
if x in (0, 1):
108+
return x, x ^ 1
109+
l, r = dfs(root.left), dfs(root.right)
110+
if x == 2:
111+
return l[0] + r[0], min(l[0] + r[1], l[1] + r[0], l[1] + r[1])
112+
if x == 3:
113+
return min(l[0] + r[0], l[0] + r[1], l[1] + r[0]), l[1] + r[1]
114+
if x == 4:
115+
return min(l[0] + r[0], l[1] + r[1]), min(l[0] + r[1], l[1] + r[0])
116+
return min(l[1], r[1]), min(l[0], r[0])
117+
118+
return dfs(root)[int(result)]
78119
```
79120

80121
### **Java**
81122

82123
<!-- 这里可写当前语言的特殊实现逻辑 -->
83124

84125
```java
126+
/**
127+
* Definition for a binary tree node.
128+
* public class TreeNode {
129+
* int val;
130+
* TreeNode left;
131+
* TreeNode right;
132+
* TreeNode() {}
133+
* TreeNode(int val) { this.val = val; }
134+
* TreeNode(int val, TreeNode left, TreeNode right) {
135+
* this.val = val;
136+
* this.left = left;
137+
* this.right = right;
138+
* }
139+
* }
140+
*/
141+
class Solution {
142+
public int minimumFlips(TreeNode root, boolean result) {
143+
return dfs(root)[result ? 1 : 0];
144+
}
145+
146+
private int[] dfs(TreeNode root) {
147+
if (root == null) {
148+
return new int[] {1 << 30, 1 << 30};
149+
}
150+
int x = root.val;
151+
if (x < 2) {
152+
return new int[] {x, x ^ 1};
153+
}
154+
var l = dfs(root.left);
155+
var r = dfs(root.right);
156+
int a = 0, b = 0;
157+
if (x == 2) {
158+
a = l[0] + r[0];
159+
b = Math.min(l[0] + r[1], Math.min(l[1] + r[0], l[1] + r[1]));
160+
} else if (x == 3) {
161+
a = Math.min(l[0] + r[0], Math.min(l[0] + r[1], l[1] + r[0]));
162+
b = l[1] + r[1];
163+
} else if (x == 4) {
164+
a = Math.min(l[0] + r[0], l[1] + r[1]);
165+
b = Math.min(l[0] + r[1], l[1] + r[0]);
166+
} else {
167+
a = Math.min(l[1], r[1]);
168+
b = Math.min(l[0], r[0]);
169+
}
170+
return new int[] {a, b};
171+
}
172+
}
173+
```
85174

175+
### **C++**
176+
177+
```cpp
178+
/**
179+
* Definition for a binary tree node.
180+
* struct TreeNode {
181+
* int val;
182+
* TreeNode *left;
183+
* TreeNode *right;
184+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
185+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
186+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
187+
* };
188+
*/
189+
class Solution {
190+
public:
191+
int minimumFlips(TreeNode* root, bool result) {
192+
function<pair<int, int>(TreeNode*)> dfs = [&](TreeNode* root) -> pair<int, int> {
193+
if (!root) {
194+
return {1 << 30, 1 << 30};
195+
}
196+
int x = root->val;
197+
if (x < 2) {
198+
return {x, x ^ 1};
199+
}
200+
auto [l0, l1] = dfs(root->left);
201+
auto [r0, r1] = dfs(root->right);
202+
int a = 0, b = 0;
203+
if (x == 2) {
204+
a = l0 + r0;
205+
b = min({l0 + r1, l1 + r0, l1 + r1});
206+
} else if (x == 3) {
207+
a = min({l0 + r0, l0 + r1, l1 + r0});
208+
b = l1 + r1;
209+
} else if (x == 4) {
210+
a = min(l0 + r0, l1 + r1);
211+
b = min(l0 + r1, l1 + r0);
212+
} else {
213+
a = min(l1, r1);
214+
b = min(l0, r0);
215+
}
216+
return {a, b};
217+
};
218+
auto [a, b] = dfs(root);
219+
return result ? b : a;
220+
}
221+
};
222+
```
223+
224+
### **Go**
225+
226+
```go
227+
/**
228+
* Definition for a binary tree node.
229+
* type TreeNode struct {
230+
* Val int
231+
* Left *TreeNode
232+
* Right *TreeNode
233+
* }
234+
*/
235+
func minimumFlips(root *TreeNode, result bool) int {
236+
var dfs func(*TreeNode) (int, int)
237+
dfs = func(root *TreeNode) (int, int) {
238+
if root == nil {
239+
return 1 << 30, 1 << 30
240+
}
241+
x := root.Val
242+
if x < 2 {
243+
return x, x ^ 1
244+
}
245+
l0, l1 := dfs(root.Left)
246+
r0, r1 := dfs(root.Right)
247+
var a, b int
248+
if x == 2 {
249+
a = l0 + r0
250+
b = min(l0+r1, min(l1+r0, l1+r1))
251+
} else if x == 3 {
252+
a = min(l0+r0, min(l0+r1, l1+r0))
253+
b = l1 + r1
254+
} else if x == 4 {
255+
a = min(l0+r0, l1+r1)
256+
b = min(l0+r1, l1+r0)
257+
} else {
258+
a = min(l1, r1)
259+
b = min(l0, r0)
260+
}
261+
return a, b
262+
}
263+
a, b := dfs(root)
264+
if result {
265+
return b
266+
}
267+
return a
268+
}
269+
270+
func min(a, b int) int {
271+
if a < b {
272+
return a
273+
}
274+
return b
275+
}
86276
```
87277

88278
### **TypeScript**
89279

90280
```ts
91-
281+
/**
282+
* Definition for a binary tree node.
283+
* class TreeNode {
284+
* val: number
285+
* left: TreeNode | null
286+
* right: TreeNode | null
287+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
288+
* this.val = (val===undefined ? 0 : val)
289+
* this.left = (left===undefined ? null : left)
290+
* this.right = (right===undefined ? null : right)
291+
* }
292+
* }
293+
*/
294+
295+
function minimumFlips(root: TreeNode | null, result: boolean): number {
296+
const dfs = (root: TreeNode | null): [number, number] => {
297+
if (!root) {
298+
return [1 << 30, 1 << 30];
299+
}
300+
const x = root.val;
301+
if (x < 2) {
302+
return [x, x ^ 1];
303+
}
304+
const [l0, l1] = dfs(root.left);
305+
const [r0, r1] = dfs(root.right);
306+
if (x === 2) {
307+
return [l0 + r0, Math.min(l0 + r1, l1 + r0, l1 + r1)];
308+
}
309+
if (x === 3) {
310+
return [Math.min(l0 + r0, l0 + r1, l1 + r0), l1 + r1];
311+
}
312+
if (x === 4) {
313+
return [Math.min(l0 + r0, l1 + r1), Math.min(l0 + r1, l1 + r0)];
314+
}
315+
return [Math.min(l1, r1), Math.min(l0, r0)];
316+
};
317+
return dfs(root)[result ? 1 : 0];
318+
}
92319
```
93320

94321
### **...**

0 commit comments

Comments
 (0)