add: 230419
This commit is contained in:
parent
85661e9df6
commit
06b1e482b1
|
|
@ -0,0 +1,58 @@
|
||||||
|
#include <algorithm>
|
||||||
|
#include <numeric>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
struct TreeNode {
|
||||||
|
int val;
|
||||||
|
TreeNode* left;
|
||||||
|
TreeNode* right;
|
||||||
|
|
||||||
|
explicit TreeNode(int x, TreeNode* left = nullptr, TreeNode* right = nullptr) : val(x), left(left), right(right) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1372. Longest ZigZag Path in a Binary Tree
|
||||||
|
*
|
||||||
|
* You are given the root of a binary tree.
|
||||||
|
*
|
||||||
|
* A ZigZag path for a binary tree is defined as follow:
|
||||||
|
*
|
||||||
|
* Choose any node in the binary tree and a direction (right or left).
|
||||||
|
* If the current direction is right, move to the right child of the current node; otherwise, move to the left child.
|
||||||
|
* Change the direction from right to left or from left to right.
|
||||||
|
* Repeat the second and third steps until you can't move in the tree.
|
||||||
|
* Zigzag length is defined as the number of nodes visited - 1. (A single node has a length of 0).
|
||||||
|
*
|
||||||
|
* Return the longest ZigZag path contained in that tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
private:
|
||||||
|
std::pair<int, int> f(TreeNode* r) noexcept;
|
||||||
|
|
||||||
|
std::unordered_map<TreeNode*, std::pair<int, int>> m;
|
||||||
|
|
||||||
|
public:
|
||||||
|
int longestZigZag(TreeNode* root) noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
int Solution::longestZigZag(TreeNode* root) noexcept {
|
||||||
|
f(root);
|
||||||
|
return std::transform_reduce(m.begin(), m.end(), 0, [](int x, int y) { return std::max(x, y); }, [](auto&& x) {
|
||||||
|
return std::max(x.second.first, x.second.second);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair<int, int> Solution::f(TreeNode* r) noexcept {
|
||||||
|
if (m.count(r))
|
||||||
|
return m[r];
|
||||||
|
return m[r] = {
|
||||||
|
r->left ? f(r->left).second + 1 : 0,
|
||||||
|
r->right ? f(r->right).first + 1 : 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -4,4 +4,4 @@ PROJECT(2304)
|
||||||
SET(CMAKE_CXX_STANDARD 23)
|
SET(CMAKE_CXX_STANDARD 23)
|
||||||
SET(CMAKE_EXPORT_COMPILE_COMMANDS true)
|
SET(CMAKE_EXPORT_COMPILE_COMMANDS true)
|
||||||
|
|
||||||
ADD_EXECUTABLE(2304 230420-CN.cpp)
|
ADD_EXECUTABLE(2304 230419.cpp)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue