class Solution {
public:
int numberOfNodes(int n, vector<int>& queries) {
}
};
2445. 值为 1 的节点数
有一个 无向 树,有 n
个节点,节点标记为从 1
到 n
,还有 n - 1
条边。给定整数 n
。标记为 v
的节点的父节点是标记为 floor (v / 2)
的节点。树的根节点是标记为 1
的节点。
n = 7
,那么标记为 3
的节点将标记 floor(3 / 2) = 1
的节点作为其父节点,标记为 7
的节点将标记 floor(7 / 2) = 3
的节点作为其父节点。你还得到一个整数数组 queries
。最初,每个节点的值都是 0
。对于每个查询 queries[i]
,您应该翻转节点标记为 queries[i]
的子树中的所有值。
在 处理完所有查询后,返回值为 1
的节点总数。
注意:
0
的节点变为 1
,反之亦然。floor(x)
相当于将 x
舍入到最接近的整数。
示例 1:
输入: n = 5 , queries = [1,2,5] 输出: 3 解释: 上图显示了执行查询后的树结构及其状态。蓝色节点表示值 0,红色节点表示值 1。 在处理查询之后,有三个红色节点 (值为 1 的节点): 1、3、5。
示例 2:
输入: n = 3, queries = [2,3,3] 输出: 1 解释: 上图显示了执行查询后的树结构及其状态。蓝色节点表示值 0,红色节点表示值 1。 在处理查询之后,有一个红色节点 (值为 1 的节点): 2。
提示:
1 <= n <= 105
1 <= queries.length <= 105
1 <= queries[i] <= n
原站题解
golang 解法, 执行用时: 128 ms, 内存消耗: 8.3 MB, 提交时间: 2023-10-16 23:23:31
func numberOfNodes(n int, queries []int) int { nodes := make([]bool, n+1) for i := range queries{ nodes[queries[i]] = !nodes[queries[i]] } ans := 0 for i := range nodes{ if i == 0{ continue } if i == 1{ if nodes[i]{ ans++ } continue } // 需要更新状态 if (!nodes[i/2] && nodes[i]) || (nodes[i/2] && !nodes[i]){ nodes[i] = true ans++ }else{ nodes[i] = false } } return ans }
rust 解法, 执行用时: 8 ms, 内存消耗: 3.5 MB, 提交时间: 2023-10-16 23:23:04
impl Solution { pub fn number_of_nodes(n: i32, queries: Vec<i32>) -> i32 { use std::collections::HashMap; fn dfs(q: &Vec<i32>, node: usize, father_val: i32) -> i32 { if node < q.len() { let val = (father_val + q[node]) & 1; let mut ans = dfs(q, 2 * node, val); ans += dfs(q, 2 * node + 1, val); ans + val } else { 0 } } let mut q = vec![0; n as usize + 1]; queries.into_iter().for_each(|x| q[x as usize] += 1); dfs(&q, 1, 0) } pub fn number_of_nodes2(n: i32, mut queries: Vec<i32>) -> i32 { fn dfs(t: &mut Vec<i32>, i: usize) { let len = t.len(); t[i] ^= 1; if 2 * i < len { dfs(t, 2 * i); } if 2 * i + 1 < len { dfs(t, 2 * i + 1); } } let mut t = vec![0; n as usize + 1]; let mut i = 0; queries.sort_unstable(); for j in 0..queries.len() { if queries[i] == queries[j] { continue; } if (j - i) & 1 != 0 { dfs(&mut t, queries[i] as usize); } i = j; } if (queries.len() - i) & 1 != 0 { dfs(&mut t, queries[i] as usize); } t.into_iter().sum() } }
java 解法, 执行用时: 8 ms, 内存消耗: 59.2 MB, 提交时间: 2023-10-16 23:22:18
class Solution { public int numberOfNodes(int n, int[] queries) { int m = n % 2 == 1 ? n : n + 1, ans = 0; int[] nodes = new int[m + 1]; for(int i : queries) nodes[i]++; for(int i = 1; i <= m / 2; i++){ // for处理结束后,nodes[query]: 标号为 query 的结点的反转次数 if(nodes[i] % 2 == 1) ans++; // 边推送边累计,如果反转次数是奇数,累计“1” nodes[i * 2] += nodes[i]; nodes[i * 2 + 1] += nodes[i]; } for(int i = m / 2 + 1; i <= n; i++){ // 继续累积 m/2+1 之后的结点 if(nodes[i] % 2 == 1) ans++; // 如果反转次数是奇数,累计“1” } return ans; } }
cpp 解法, 执行用时: 612 ms, 内存消耗: 155.6 MB, 提交时间: 2023-10-16 23:21:54
class Solution { public: int numberOfNodes(int n, vector<int>& queries) { map<int, int> cnt; for (auto& q: queries) cnt[q]++; function<int(int, int)> dfs = [&] (int node, int c) -> int { if (node > n) return 0; int nc = (c + cnt[node]) % 2; int ans = nc; ans += dfs(node * 2, nc); ans += dfs(node * 2 + 1, nc); return ans; }; return dfs(1, 0); } };
python3 解法, 执行用时: 1020 ms, 内存消耗: 55 MB, 提交时间: 2023-10-16 23:21:42
class Solution: def numberOfNodes(self, n: int, queries: List[int]) -> int: cnt = Counter(queries) def dfs(node: int, c: int) -> int: if node > n: return 0 nc = (c + cnt[node]) % 2 ans = nc ans += dfs(node * 2, nc) ans += dfs(node * 2 + 1, nc) return ans return dfs(1, 0)