Skip to content

Commit b3397d0

Browse files
committed
2313 solved.
1 parent 177e4e7 commit b3397d0

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
cmake_minimum_required(VERSION 3.22)
2+
project(cpp_2313)
3+
4+
set(CMAKE_CXX_STANDARD 14)
5+
6+
add_executable(cpp_2313 main.cpp)
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/// Source : https://leetcode.com/problems/minimum-flips-in-binary-tree-to-get-result/
2+
/// Author : liuyubobobo
3+
/// Time : 2022-06-22
4+
5+
#include <iostream>
6+
#include <vector>
7+
#include <unordered_map>
8+
#include <cassert>
9+
10+
using namespace std;
11+
12+
13+
/// Tree DP
14+
/// Time Complexity: O(n)
15+
/// Space Complexity: O(n)
16+
/// Definition for a binary tree node.
17+
struct TreeNode {
18+
int val;
19+
TreeNode *left;
20+
TreeNode *right;
21+
TreeNode() : val(0), left(nullptr), right(nullptr) {}
22+
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
23+
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
24+
};
25+
26+
class Solution {
27+
public:
28+
int minimumFlips(TreeNode* root, bool result) {
29+
30+
vector<unordered_map<TreeNode*, int>> dp(2);
31+
return dfs(root, result, dp);
32+
}
33+
34+
private:
35+
int dfs(TreeNode* node, bool result, vector<unordered_map<TreeNode*, int>>& dp){
36+
37+
if(node->left == nullptr && node->right == nullptr)
38+
return result != node->val;
39+
40+
auto iter = dp[result].find(node);
41+
if(iter != dp[result].end()) return iter->second;
42+
43+
if(node->val == 5){
44+
TreeNode* child = node->left ? node->left : node->right;
45+
return dp[result][node] = dfs(child, !result, dp);
46+
}
47+
48+
TreeNode* node1 = node->left, *node2 = node->right;
49+
int res = INT_MAX;
50+
for(int res1 = 0; res1 <= 1; res1 ++)
51+
for(int res2 = 0; res2 <= 1; res2 ++)
52+
if(calc(res1, res2, node->val) == result)
53+
res = min(res, dfs(node1, res1, dp) + dfs(node2, res2, dp));
54+
return dp[result][node] = res;
55+
}
56+
57+
int calc(int a, int b, int op){
58+
switch(op){
59+
case 2: return a | b;
60+
case 3: return a & b;
61+
case 4: return a ^ b;
62+
default: assert(false);
63+
}
64+
return -1;
65+
}
66+
};
67+
68+
69+
int main() {
70+
71+
return 0;
72+
}

readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2158,6 +2158,7 @@ email: [liuyubobobo@gmail.com](mailto:liuyubobobo@gmail.com)
21582158
| 2310 | [Sum of Numbers With Units Digit K](https://leetcode.com/problems/sum-of-numbers-with-units-digit-k/) | [] | [C++](2001-2500/2310-Sum-of-Numbers-With-Units-Digit-K/cpp-2310/) | | |
21592159
| | | | | | |
21602160
| 2312 | [Selling Pieces of Wood](https://leetcode.com/problems/selling-pieces-of-wood/) | [] | [C++](2001-2500/2312-Selling-Pieces-of-Wood/cpp-2312/) | | |
2161+
| 2313 | [Minimum Flips in Binary Tree to Get Result](https://leetcode.com/problems/minimum-flips-in-binary-tree-to-get-result/) | [] | [C++](2001-2500/2313-Minimum-Flips-in-Binary-Tree-to-Get-Result/cpp-2313/) | | |
21612162
| | | | | | |
21622163

21632164
## 力扣中文站比赛

0 commit comments

Comments
 (0)