Skip to content

Commit 4eb2baa

Browse files
committed
feat: add solutions to lc problem: No.2509
No.2509.Cycle Length Queries in a Tree
1 parent 4c10e56 commit 4eb2baa

File tree

6 files changed

+218
-8
lines changed

6 files changed

+218
-8
lines changed

solution/2500-2599/2509.Cycle Length Queries in a Tree/README.md

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,34 +74,108 @@
7474

7575
<!-- 这里可写通用的实现逻辑 -->
7676

77+
**方法一:求最近公共祖先**
78+
79+
对于每次查询,我们找出 $a$, $b$ 两个节点的最近公共祖先,并且记录向上走的步数,那么此次查询的答案就是步数加一。
80+
81+
求最近公共祖先时,如果 $a \gt b$,那么我们将 $a$ 往父节点移动;如果 $a \lt b$,我们将 $b$ 往其父节点移动。过程中累计步数,直至 $a = b$。
82+
83+
时间复杂度 $O(n \times m)$。其中 $m$ 为数组 `queries` 的长度。
84+
7785
<!-- tabs:start -->
7886

7987
### **Python3**
8088

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

8391
```python
84-
92+
class Solution:
93+
def cycleLengthQueries(self, n: int, queries: List[List[int]]) -> List[int]:
94+
ans = []
95+
for a, b in queries:
96+
t = 1
97+
while a != b:
98+
if a > b:
99+
a >>= 1
100+
else:
101+
b >>= 1
102+
t += 1
103+
ans.append(t)
104+
return ans
85105
```
86106

87107
### **Java**
88108

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

91111
```java
92-
112+
class Solution {
113+
public int[] cycleLengthQueries(int n, int[][] queries) {
114+
int m = queries.length;
115+
int[] ans = new int[m];
116+
for (int i = 0; i < m; ++i) {
117+
int a = queries[i][0], b = queries[i][1];
118+
int t = 1;
119+
while (a != b) {
120+
if (a > b) {
121+
a >>= 1;
122+
} else {
123+
b >>= 1;
124+
}
125+
++t;
126+
}
127+
ans[i] = t;
128+
}
129+
return ans;
130+
}
131+
}
93132
```
94133

95134
### **C++**
96135

97136
```cpp
98-
137+
class Solution {
138+
public:
139+
vector<int> cycleLengthQueries(int n, vector<vector<int>>& queries) {
140+
vector<int> ans;
141+
for (auto& q : queries) {
142+
int a = q[0], b = q[1];
143+
int t = 1;
144+
while (a != b) {
145+
if (a > b) {
146+
a >>= 1;
147+
} else {
148+
b >>= 1;
149+
}
150+
++t;
151+
}
152+
ans.emplace_back(t);
153+
}
154+
return ans;
155+
}
156+
};
99157
```
100158
101159
### **Go**
102160
103161
```go
104-
162+
func cycleLengthQueries(n int, queries [][]int) []int {
163+
ans := []int{}
164+
for _, q := range queries {
165+
a, b := q[0], q[1]
166+
t := 1
167+
for a != b {
168+
if a > b {
169+
a >>= 1
170+
} else {
171+
b >>= 1
172+
}
173+
t++
174+
}
175+
ans = append(ans, t)
176+
}
177+
return ans
178+
}
105179
```
106180

107181
### **...**

solution/2500-2599/2509.Cycle Length Queries in a Tree/README_EN.md

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,25 +69,91 @@
6969
### **Python3**
7070

7171
```python
72-
72+
class Solution:
73+
def cycleLengthQueries(self, n: int, queries: List[List[int]]) -> List[int]:
74+
ans = []
75+
for a, b in queries:
76+
t = 1
77+
while a != b:
78+
if a > b:
79+
a >>= 1
80+
else:
81+
b >>= 1
82+
t += 1
83+
ans.append(t)
84+
return ans
7385
```
7486

7587
### **Java**
7688

7789
```java
78-
90+
class Solution {
91+
public int[] cycleLengthQueries(int n, int[][] queries) {
92+
int m = queries.length;
93+
int[] ans = new int[m];
94+
for (int i = 0; i < m; ++i) {
95+
int a = queries[i][0], b = queries[i][1];
96+
int t = 1;
97+
while (a != b) {
98+
if (a > b) {
99+
a >>= 1;
100+
} else {
101+
b >>= 1;
102+
}
103+
++t;
104+
}
105+
ans[i] = t;
106+
}
107+
return ans;
108+
}
109+
}
79110
```
80111

81112
### **C++**
82113

83114
```cpp
84-
115+
class Solution {
116+
public:
117+
vector<int> cycleLengthQueries(int n, vector<vector<int>>& queries) {
118+
vector<int> ans;
119+
for (auto& q : queries) {
120+
int a = q[0], b = q[1];
121+
int t = 1;
122+
while (a != b) {
123+
if (a > b) {
124+
a >>= 1;
125+
} else {
126+
b >>= 1;
127+
}
128+
++t;
129+
}
130+
ans.emplace_back(t);
131+
}
132+
return ans;
133+
}
134+
};
85135
```
86136
87137
### **Go**
88138
89139
```go
90-
140+
func cycleLengthQueries(n int, queries [][]int) []int {
141+
ans := []int{}
142+
for _, q := range queries {
143+
a, b := q[0], q[1]
144+
t := 1
145+
for a != b {
146+
if a > b {
147+
a >>= 1
148+
} else {
149+
b >>= 1
150+
}
151+
t++
152+
}
153+
ans = append(ans, t)
154+
}
155+
return ans
156+
}
91157
```
92158

93159
### **...**
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
vector<int> cycleLengthQueries(int n, vector<vector<int>>& queries) {
4+
vector<int> ans;
5+
for (auto& q : queries) {
6+
int a = q[0], b = q[1];
7+
int t = 1;
8+
while (a != b) {
9+
if (a > b) {
10+
a >>= 1;
11+
} else {
12+
b >>= 1;
13+
}
14+
++t;
15+
}
16+
ans.emplace_back(t);
17+
}
18+
return ans;
19+
}
20+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
func cycleLengthQueries(n int, queries [][]int) []int {
2+
ans := []int{}
3+
for _, q := range queries {
4+
a, b := q[0], q[1]
5+
t := 1
6+
for a != b {
7+
if a > b {
8+
a >>= 1
9+
} else {
10+
b >>= 1
11+
}
12+
t++
13+
}
14+
ans = append(ans, t)
15+
}
16+
return ans
17+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int[] cycleLengthQueries(int n, int[][] queries) {
3+
int m = queries.length;
4+
int[] ans = new int[m];
5+
for (int i = 0; i < m; ++i) {
6+
int a = queries[i][0], b = queries[i][1];
7+
int t = 1;
8+
while (a != b) {
9+
if (a > b) {
10+
a >>= 1;
11+
} else {
12+
b >>= 1;
13+
}
14+
++t;
15+
}
16+
ans[i] = t;
17+
}
18+
return ans;
19+
}
20+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def cycleLengthQueries(self, n: int, queries: List[List[int]]) -> List[int]:
3+
ans = []
4+
for a, b in queries:
5+
t = 1
6+
while a != b:
7+
if a > b:
8+
a >>= 1
9+
else:
10+
b >>= 1
11+
t += 1
12+
ans.append(t)
13+
return ans

0 commit comments

Comments
 (0)