From b4882e8b3c4258825f514f8b3336e022279954c4 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Mon, 11 Dec 2023 20:34:18 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.2415 No.2415.Reverse Odd Levels of Binary Tree --- .../README.md | 103 ++++++----------- .../README_EN.md | 105 +++++++----------- .../Solution.cpp | 78 ++++++------- .../Solution.go | 17 +-- .../Solution.java | 85 +++++++------- .../Solution.py | 50 ++++----- .../Solution.ts | 27 ++--- .../README.md | 2 +- 8 files changed, 187 insertions(+), 280 deletions(-) diff --git a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/README.md b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/README.md index 619fe7539262c..03ac2cad85b51 100644 --- a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/README.md +++ b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/README.md @@ -65,9 +65,9 @@ **方法一:BFS** -BFS 遍历二叉树,遍历到奇数层时,反转该层节点的值。 +我们可以使用广度优先搜索的方法,用一个队列 $q$ 来存储每一层的节点,用一个变量 $i$ 记录当前层数。若 $i$ 为奇数,则将当前层的节点值反转。 -时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点个数。 +时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点数。 @@ -87,20 +87,16 @@ class Solution: q = deque([root]) i = 0 while q: - t = [] + if i & 1: + l, r = 0, len(q) - 1 + while l < r: + q[l].val, q[r].val = q[r].val, q[l].val + l, r = l + 1, r - 1 for _ in range(len(q)): node = q.popleft() - if i & 1: - t.append(node) if node.left: q.append(node.left) - if node.right: q.append(node.right) - if t: - j, k = 0, len(t) - 1 - while j < k: - t[j].val, t[k].val = t[k].val, t[j].val - j, k = j + 1, k - 1 i += 1 return root ``` @@ -129,30 +125,23 @@ class Solution { public TreeNode reverseOddLevels(TreeNode root) { Deque q = new ArrayDeque<>(); q.offer(root); - int i = 0; - while (!q.isEmpty()) { + for (int i = 0; !q.isEmpty(); ++i) { List t = new ArrayList<>(); - for (int n = q.size(); n > 0; --n) { - TreeNode node = q.pollFirst(); + for (int k = q.size(); k > 0; --k) { + var node = q.poll(); if (i % 2 == 1) { t.add(node); } if (node.left != null) { q.offer(node.left); - } - if (node.right != null) { q.offer(node.right); } } - if (!t.isEmpty()) { - int j = 0, k = t.size() - 1; - for (; j < k; ++j, --k) { - int v = t.get(j).val; - t.get(j).val = t.get(k).val; - t.get(k).val = v; - } + for (int l = 0, r = t.size() - 1; l < r; ++l, --r) { + var x = t.get(l).val; + t.get(l).val = t.get(r).val; + t.get(r).val = x; } - ++i; } return root; } @@ -177,11 +166,9 @@ class Solution { public: TreeNode* reverseOddLevels(TreeNode* root) { queue q{{root}}; - int i = 0; - vector t; - while (!q.empty()) { - t.clear(); - for (int n = q.size(); n; --n) { + for (int i = 0; q.size(); ++i) { + vector t; + for (int k = q.size(); k; --k) { TreeNode* node = q.front(); q.pop(); if (i & 1) { @@ -189,20 +176,12 @@ public: } if (node->left) { q.push(node->left); - } - if (node->right) { q.push(node->right); } } - if (t.size()) { - int j = 0, k = t.size() - 1; - for (; j < k; ++j, --k) { - int v = t[j]->val; - t[j]->val = t[k]->val; - t[k]->val = v; - } + for (int l = 0, r = t.size() - 1; l < r; ++l, --r) { + swap(t[l]->val, t[r]->val); } - ++i; } return root; } @@ -222,10 +201,9 @@ public: */ func reverseOddLevels(root *TreeNode) *TreeNode { q := []*TreeNode{root} - i := 0 - for len(q) > 0 { + for i := 0; len(q) > 0; i++ { t := []*TreeNode{} - for n := len(q); n > 0; n-- { + for k := len(q); k > 0; k-- { node := q[0] q = q[1:] if i%2 == 1 { @@ -233,20 +211,12 @@ func reverseOddLevels(root *TreeNode) *TreeNode { } if node.Left != nil { q = append(q, node.Left) - } - if node.Right != nil { q = append(q, node.Right) } } - if len(t) > 0 { - j, k := 0, len(t)-1 - for ; j < k; j, k = j+1, k-1 { - v := t[j].Val - t[j].Val = t[k].Val - t[k].Val = v - } + for l, r := 0, len(t)-1; l < r; l, r = l+1, r-1 { + t[l].Val, t[r].Val = t[r].Val, t[l].Val } - i++ } return root } @@ -270,24 +240,21 @@ func reverseOddLevels(root *TreeNode) *TreeNode { */ function reverseOddLevels(root: TreeNode | null): TreeNode | null { - const queue = [root]; - let d = 0; - while (queue.length !== 0) { - const n = queue.length; - const t: TreeNode[] = []; - for (let i = 0; i < n; i++) { - const node = queue.shift(); - if (d % 2 == 1) { - t.push(node); + const q: TreeNode[] = [root]; + for (let i = 0; q.length > 0; ++i) { + if (i % 2) { + for (let l = 0, r = q.length - 1; l < r; ++l, --r) { + [q[l].val, q[r].val] = [q[r].val, q[l].val]; } - node.left && queue.push(node.left); - node.right && queue.push(node.right); } - const m = t.length; - for (let i = 0; i < m >> 1; i++) { - [t[i].val, t[m - 1 - i].val] = [t[m - 1 - i].val, t[i].val]; + const nq: TreeNode[] = []; + for (const { left, right } of q) { + if (left) { + nq.push(left); + nq.push(right); + } } - d++; + q.splice(0, q.length, ...nq); } return root; } diff --git a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/README_EN.md b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/README_EN.md index efd3e38fba4c3..269633d357be4 100644 --- a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/README_EN.md +++ b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/README_EN.md @@ -58,6 +58,12 @@ The nodes at level 3 were 1, 1, 1, 1, 2, 2, 2, 2, and are 2, 2, 2, 2, 1, 1, 1, 1 ## Solutions +**Solution 1: BFS** + +We can use the Breadth-First Search (BFS) method, using a queue $q$ to store the nodes of each level, and a variable $i$ to record the current level. If $i$ is odd, we reverse the values of the nodes at the current level. + +The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the number of nodes in the binary tree. + ### **Python3** @@ -74,20 +80,16 @@ class Solution: q = deque([root]) i = 0 while q: - t = [] + if i & 1: + l, r = 0, len(q) - 1 + while l < r: + q[l].val, q[r].val = q[r].val, q[l].val + l, r = l + 1, r - 1 for _ in range(len(q)): node = q.popleft() - if i & 1: - t.append(node) if node.left: q.append(node.left) - if node.right: q.append(node.right) - if t: - j, k = 0, len(t) - 1 - while j < k: - t[j].val, t[k].val = t[k].val, t[j].val - j, k = j + 1, k - 1 i += 1 return root ``` @@ -114,30 +116,23 @@ class Solution { public TreeNode reverseOddLevels(TreeNode root) { Deque q = new ArrayDeque<>(); q.offer(root); - int i = 0; - while (!q.isEmpty()) { + for (int i = 0; !q.isEmpty(); ++i) { List t = new ArrayList<>(); - for (int n = q.size(); n > 0; --n) { - TreeNode node = q.pollFirst(); + for (int k = q.size(); k > 0; --k) { + var node = q.poll(); if (i % 2 == 1) { t.add(node); } if (node.left != null) { q.offer(node.left); - } - if (node.right != null) { q.offer(node.right); } } - if (!t.isEmpty()) { - int j = 0, k = t.size() - 1; - for (; j < k; ++j, --k) { - int v = t.get(j).val; - t.get(j).val = t.get(k).val; - t.get(k).val = v; - } + for (int l = 0, r = t.size() - 1; l < r; ++l, --r) { + var x = t.get(l).val; + t.get(l).val = t.get(r).val; + t.get(r).val = x; } - ++i; } return root; } @@ -162,11 +157,9 @@ class Solution { public: TreeNode* reverseOddLevels(TreeNode* root) { queue q{{root}}; - int i = 0; - vector t; - while (!q.empty()) { - t.clear(); - for (int n = q.size(); n; --n) { + for (int i = 0; q.size(); ++i) { + vector t; + for (int k = q.size(); k; --k) { TreeNode* node = q.front(); q.pop(); if (i & 1) { @@ -174,20 +167,12 @@ public: } if (node->left) { q.push(node->left); - } - if (node->right) { q.push(node->right); } } - if (t.size()) { - int j = 0, k = t.size() - 1; - for (; j < k; ++j, --k) { - int v = t[j]->val; - t[j]->val = t[k]->val; - t[k]->val = v; - } + for (int l = 0, r = t.size() - 1; l < r; ++l, --r) { + swap(t[l]->val, t[r]->val); } - ++i; } return root; } @@ -207,10 +192,9 @@ public: */ func reverseOddLevels(root *TreeNode) *TreeNode { q := []*TreeNode{root} - i := 0 - for len(q) > 0 { + for i := 0; len(q) > 0; i++ { t := []*TreeNode{} - for n := len(q); n > 0; n-- { + for k := len(q); k > 0; k-- { node := q[0] q = q[1:] if i%2 == 1 { @@ -218,20 +202,12 @@ func reverseOddLevels(root *TreeNode) *TreeNode { } if node.Left != nil { q = append(q, node.Left) - } - if node.Right != nil { q = append(q, node.Right) } } - if len(t) > 0 { - j, k := 0, len(t)-1 - for ; j < k; j, k = j+1, k-1 { - v := t[j].Val - t[j].Val = t[k].Val - t[k].Val = v - } + for l, r := 0, len(t)-1; l < r; l, r = l+1, r-1 { + t[l].Val, t[r].Val = t[r].Val, t[l].Val } - i++ } return root } @@ -255,24 +231,21 @@ func reverseOddLevels(root *TreeNode) *TreeNode { */ function reverseOddLevels(root: TreeNode | null): TreeNode | null { - const queue = [root]; - let d = 0; - while (queue.length !== 0) { - const n = queue.length; - const t: TreeNode[] = []; - for (let i = 0; i < n; i++) { - const node = queue.shift(); - if (d % 2 == 1) { - t.push(node); + const q: TreeNode[] = [root]; + for (let i = 0; q.length > 0; ++i) { + if (i % 2) { + for (let l = 0, r = q.length - 1; l < r; ++l, --r) { + [q[l].val, q[r].val] = [q[r].val, q[l].val]; } - node.left && queue.push(node.left); - node.right && queue.push(node.right); } - const m = t.length; - for (let i = 0; i < m >> 1; i++) { - [t[i].val, t[m - 1 - i].val] = [t[m - 1 - i].val, t[i].val]; + const nq: TreeNode[] = []; + for (const { left, right } of q) { + if (left) { + nq.push(left); + nq.push(right); + } } - d++; + q.splice(0, q.length, ...nq); } return root; } diff --git a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.cpp b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.cpp index 2822130ad73af..1aba662067d62 100644 --- a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.cpp +++ b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.cpp @@ -1,45 +1,35 @@ -/** - * Definition for a binary tree node. - * struct TreeNode { - * int val; - * TreeNode *left; - * TreeNode *right; - * TreeNode() : val(0), left(nullptr), right(nullptr) {} - * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} - * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} - * }; - */ -class Solution { -public: - TreeNode* reverseOddLevels(TreeNode* root) { - queue q{{root}}; - int i = 0; - vector t; - while (!q.empty()) { - t.clear(); - for (int n = q.size(); n; --n) { - TreeNode* node = q.front(); - q.pop(); - if (i & 1) { - t.push_back(node); - } - if (node->left) { - q.push(node->left); - } - if (node->right) { - q.push(node->right); - } - } - if (t.size()) { - int j = 0, k = t.size() - 1; - for (; j < k; ++j, --k) { - int v = t[j]->val; - t[j]->val = t[k]->val; - t[k]->val = v; - } - } - ++i; - } - return root; - } +/** + * Definition for a binary tree node. + * struct TreeNode { + * int val; + * TreeNode *left; + * TreeNode *right; + * TreeNode() : val(0), left(nullptr), right(nullptr) {} + * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} + * }; + */ +class Solution { +public: + TreeNode* reverseOddLevels(TreeNode* root) { + queue q{{root}}; + for (int i = 0; q.size(); ++i) { + vector t; + for (int k = q.size(); k; --k) { + TreeNode* node = q.front(); + q.pop(); + if (i & 1) { + t.push_back(node); + } + if (node->left) { + q.push(node->left); + q.push(node->right); + } + } + for (int l = 0, r = t.size() - 1; l < r; ++l, --r) { + swap(t[l]->val, t[r]->val); + } + } + return root; + } }; \ No newline at end of file diff --git a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.go b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.go index 95a1e1439f231..c64148f85f4b8 100644 --- a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.go +++ b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.go @@ -8,10 +8,9 @@ */ func reverseOddLevels(root *TreeNode) *TreeNode { q := []*TreeNode{root} - i := 0 - for len(q) > 0 { + for i := 0; len(q) > 0; i++ { t := []*TreeNode{} - for n := len(q); n > 0; n-- { + for k := len(q); k > 0; k-- { node := q[0] q = q[1:] if i%2 == 1 { @@ -19,20 +18,12 @@ func reverseOddLevels(root *TreeNode) *TreeNode { } if node.Left != nil { q = append(q, node.Left) - } - if node.Right != nil { q = append(q, node.Right) } } - if len(t) > 0 { - j, k := 0, len(t)-1 - for ; j < k; j, k = j+1, k-1 { - v := t[j].Val - t[j].Val = t[k].Val - t[k].Val = v - } + for l, r := 0, len(t)-1; l < r; l, r = l+1, r-1 { + t[l].Val, t[r].Val = t[r].Val, t[l].Val } - i++ } return root } \ No newline at end of file diff --git a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.java b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.java index 5d9ab34b54422..3be6bc67f81b7 100644 --- a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.java +++ b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.java @@ -1,47 +1,40 @@ -/** - * Definition for a binary tree node. - * public class TreeNode { - * int val; - * TreeNode left; - * TreeNode right; - * TreeNode() {} - * TreeNode(int val) { this.val = val; } - * TreeNode(int val, TreeNode left, TreeNode right) { - * this.val = val; - * this.left = left; - * this.right = right; - * } - * } - */ -class Solution { - public TreeNode reverseOddLevels(TreeNode root) { - Deque q = new ArrayDeque<>(); - q.offer(root); - int i = 0; - while (!q.isEmpty()) { - List t = new ArrayList<>(); - for (int n = q.size(); n > 0; --n) { - TreeNode node = q.pollFirst(); - if (i % 2 == 1) { - t.add(node); - } - if (node.left != null) { - q.offer(node.left); - } - if (node.right != null) { - q.offer(node.right); - } - } - if (!t.isEmpty()) { - int j = 0, k = t.size() - 1; - for (; j < k; ++j, --k) { - int v = t.get(j).val; - t.get(j).val = t.get(k).val; - t.get(k).val = v; - } - } - ++i; - } - return root; - } +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + public TreeNode reverseOddLevels(TreeNode root) { + Deque q = new ArrayDeque<>(); + q.offer(root); + for (int i = 0; !q.isEmpty(); ++i) { + List t = new ArrayList<>(); + for (int k = q.size(); k > 0; --k) { + var node = q.poll(); + if (i % 2 == 1) { + t.add(node); + } + if (node.left != null) { + q.offer(node.left); + q.offer(node.right); + } + } + for (int l = 0, r = t.size() - 1; l < r; ++l, --r) { + var x = t.get(l).val; + t.get(l).val = t.get(r).val; + t.get(r).val = x; + } + } + return root; + } } \ No newline at end of file diff --git a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.py b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.py index b25586d22e82d..de4660157f546 100644 --- a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.py +++ b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.py @@ -1,27 +1,23 @@ -# 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 reverseOddLevels(self, root: Optional[TreeNode]) -> Optional[TreeNode]: - q = deque([root]) - i = 0 - while q: - t = [] - for _ in range(len(q)): - node = q.popleft() - if i & 1: - t.append(node) - if node.left: - q.append(node.left) - if node.right: - q.append(node.right) - if t: - j, k = 0, len(t) - 1 - while j < k: - t[j].val, t[k].val = t[k].val, t[j].val - j, k = j + 1, k - 1 - i += 1 - return root +# 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 reverseOddLevels(self, root: Optional[TreeNode]) -> Optional[TreeNode]: + q = deque([root]) + i = 0 + while q: + if i & 1: + l, r = 0, len(q) - 1 + while l < r: + q[l].val, q[r].val = q[r].val, q[l].val + l, r = l + 1, r - 1 + for _ in range(len(q)): + node = q.popleft() + if node.left: + q.append(node.left) + q.append(node.right) + i += 1 + return root diff --git a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.ts b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.ts index 53e2b8292097b..5a246b3116209 100644 --- a/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.ts +++ b/solution/2400-2499/2415.Reverse Odd Levels of Binary Tree/Solution.ts @@ -13,24 +13,21 @@ */ function reverseOddLevels(root: TreeNode | null): TreeNode | null { - const queue = [root]; - let d = 0; - while (queue.length !== 0) { - const n = queue.length; - const t: TreeNode[] = []; - for (let i = 0; i < n; i++) { - const node = queue.shift(); - if (d % 2 == 1) { - t.push(node); + const q: TreeNode[] = [root]; + for (let i = 0; q.length > 0; ++i) { + if (i % 2) { + for (let l = 0, r = q.length - 1; l < r; ++l, --r) { + [q[l].val, q[r].val] = [q[r].val, q[l].val]; } - node.left && queue.push(node.left); - node.right && queue.push(node.right); } - const m = t.length; - for (let i = 0; i < m >> 1; i++) { - [t[i].val, t[m - 1 - i].val] = [t[m - 1 - i].val, t[i].val]; + const nq: TreeNode[] = []; + for (const { left, right } of q) { + if (left) { + nq.push(left); + nq.push(right); + } } - d++; + q.splice(0, q.length, ...nq); } return root; } diff --git a/solution/2900-2999/2960.Count Tested Devices After Test Operations/README.md b/solution/2900-2999/2960.Count Tested Devices After Test Operations/README.md index 9aa3117e069cb..dd792970396cd 100644 --- a/solution/2900-2999/2960.Count Tested Devices After Test Operations/README.md +++ b/solution/2900-2999/2960.Count Tested Devices After Test Operations/README.md @@ -66,7 +66,7 @@ **方法一:模拟** -假设我们当前已测试的设备数量为 $ans$,如果当测试新的一台设备 $i$ 时,它的剩余电量为 $\max(0, batteryPercentages[i] - ans)$,如果剩余电量大于 $0$,则说明这台设备可以进行测试,此时我们需要将 $ans$ 增加 $1$。 +假设我们当前已测试的设备数量为 $ans$,当测试新的一台设备 $i$ 时,它的剩余电量为 $\max(0, batteryPercentages[i] - ans)$,如果剩余电量大于 $0$,则说明这台设备可以进行测试,此时我们需要将 $ans$ 增加 $1$。 最后返回 $ans$ 即可。