File tree Expand file tree Collapse file tree 6 files changed +218
-8
lines changed
solution/2500-2599/2509.Cycle Length Queries in a Tree Expand file tree Collapse file tree 6 files changed +218
-8
lines changed Original file line number Diff line number Diff line change 74
74
75
75
<!-- 这里可写通用的实现逻辑 -->
76
76
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
+
77
85
<!-- tabs:start -->
78
86
79
87
### ** Python3**
80
88
81
89
<!-- 这里可写当前语言的特殊实现逻辑 -->
82
90
83
91
``` 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
85
105
```
86
106
87
107
### ** Java**
88
108
89
109
<!-- 这里可写当前语言的特殊实现逻辑 -->
90
110
91
111
``` 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
+ }
93
132
```
94
133
95
134
### ** C++**
96
135
97
136
``` 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
+ };
99
157
```
100
158
101
159
### **Go**
102
160
103
161
```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
+ }
105
179
```
106
180
107
181
### ** ...**
Original file line number Diff line number Diff line change 69
69
### ** Python3**
70
70
71
71
``` 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
73
85
```
74
86
75
87
### ** Java**
76
88
77
89
``` 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
+ }
79
110
```
80
111
81
112
### ** C++**
82
113
83
114
``` 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
+ };
85
135
```
86
136
87
137
### **Go**
88
138
89
139
```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
+ }
91
157
```
92
158
93
159
### ** ...**
Original file line number Diff line number Diff line change
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
+ };
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments