Skip to content

Commit 03b27b6

Browse files
committed
feat: add solutions to lc problem: No.1766
No.1766.Tree of Coprimes
1 parent 50eaafc commit 03b27b6

File tree

6 files changed

+544
-1
lines changed

6 files changed

+544
-1
lines changed

solution/1700-1799/1766.Tree of Coprimes/README.md

+190-1
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,211 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62+
**方法一:预处理 + 枚举 + 栈 + 回溯**
63+
64+
由于题目中 $nums[i]$ 的取值范围为 $[1, 50]$,因此我们可以预处理出每个数的所有互质数,记录在数组 $f$ 中,其中 $f[i]$ 表示 $i$ 的所有互质数。
65+
66+
接下来我们可以使用回溯的方法,从根节点开始遍历整棵树,对于每个节点 $i$,我们可以通过 $f$ 数组得到 $nums[i]$ 的所有互质数。然后我们枚举 $nums[i]$ 的所有互质数,找到已经出现过的且深度最大的祖先节点 $t$,即为 $i$ 的最近的互质祖先节点。这里我们可以用一个长度为 $51$ 的栈数组 $stks$ 来获取每个出现过的值 $v$ 的节点以及其深度。每个栈 $stks[v]$ 的栈顶元素就是最近的深度最大的祖先节点。
67+
68+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为节点个数。
69+
6270
<!-- tabs:start -->
6371

6472
### **Python3**
6573

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

6876
```python
69-
77+
class Solution:
78+
def getCoprimes(self, nums: List[int], edges: List[List[int]]) -> List[int]:
79+
def dfs(i, fa, depth):
80+
t = k = -1
81+
for v in f[nums[i]]:
82+
stk = stks[v]
83+
if stk and stk[-1][1] > k:
84+
t, k = stk[-1]
85+
ans[i] = t
86+
for j in g[i]:
87+
if j != fa:
88+
stks[nums[i]].append((i, depth))
89+
dfs(j, i, depth + 1)
90+
stks[nums[i]].pop()
91+
92+
g = defaultdict(list)
93+
for u, v in edges:
94+
g[u].append(v)
95+
g[v].append(u)
96+
f = defaultdict(list)
97+
for i in range(1, 51):
98+
for j in range(1, 51):
99+
if gcd(i, j) == 1:
100+
f[i].append(j)
101+
stks = defaultdict(list)
102+
ans = [-1] * len(nums)
103+
dfs(0, -1, 0)
104+
return ans
70105
```
71106

72107
### **Java**
73108

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

76111
```java
112+
class Solution {
113+
private List<Integer>[] g;
114+
private List<Integer>[] f;
115+
private Deque<int[]>[] stks;
116+
private int[] nums;
117+
private int[] ans;
118+
119+
public int[] getCoprimes(int[] nums, int[][] edges) {
120+
int n = nums.length;
121+
g = new List[n];
122+
Arrays.setAll(g, k -> new ArrayList<>());
123+
for (var e : edges) {
124+
int u = e[0], v = e[1];
125+
g[u].add(v);
126+
g[v].add(u);
127+
}
128+
f = new List[51];
129+
stks = new Deque[51];
130+
Arrays.setAll(f, k -> new ArrayList<>());
131+
Arrays.setAll(stks, k -> new ArrayDeque<>());
132+
for (int i = 1; i < 51; ++i) {
133+
for (int j = 1; j < 51; ++j) {
134+
if (gcd(i, j) == 1) {
135+
f[i].add(j);
136+
}
137+
}
138+
}
139+
this.nums = nums;
140+
ans = new int[n];
141+
dfs(0, -1, 0);
142+
return ans;
143+
}
144+
145+
private void dfs(int i, int fa, int depth) {
146+
int t = -1, k = -1;
147+
for (int v : f[nums[i]]) {
148+
var stk = stks[v];
149+
if (!stk.isEmpty() && stk.peek()[1] > k) {
150+
t = stk.peek()[0];
151+
k = stk.peek()[1];
152+
}
153+
}
154+
ans[i] = t;
155+
for (int j : g[i]) {
156+
if (j != fa) {
157+
stks[nums[i]].push(new int[] {i, depth});
158+
dfs(j, i, depth + 1);
159+
stks[nums[i]].pop();
160+
}
161+
}
162+
}
163+
164+
private int gcd(int a, int b) {
165+
return b == 0 ? a : gcd(b, a % b);
166+
}
167+
}
168+
```
169+
170+
### **C++**
171+
172+
```cpp
173+
class Solution {
174+
public:
175+
vector<int> getCoprimes(vector<int>& nums, vector<vector<int>>& edges) {
176+
int n = nums.size();
177+
vector<vector<int>> g(n);
178+
vector<vector<int>> f(51);
179+
vector<stack<pair<int, int>>> stks(51);
180+
for (auto& e : edges) {
181+
int u = e[0], v = e[1];
182+
g[u].emplace_back(v);
183+
g[v].emplace_back(u);
184+
}
185+
for (int i = 1; i < 51; ++i) {
186+
for (int j = 1; j < 51; ++j) {
187+
if (__gcd(i, j) == 1) {
188+
f[i].emplace_back(j);
189+
}
190+
}
191+
}
192+
vector<int> ans(n);
193+
function<void(int, int, int)> dfs = [&](int i, int fa, int depth) {
194+
int t = -1, k = -1;
195+
for (int v : f[nums[i]]) {
196+
auto& stk = stks[v];
197+
if (!stk.empty() && stk.top().second > k) {
198+
t = stk.top().first;
199+
k = stk.top().second;
200+
}
201+
}
202+
ans[i] = t;
203+
for (int j : g[i]) {
204+
if (j != fa) {
205+
stks[nums[i]].push({i, depth});
206+
dfs(j, i, depth + 1);
207+
stks[nums[i]].pop();
208+
}
209+
}
210+
};
211+
dfs(0, -1, 0);
212+
return ans;
213+
}
214+
};
215+
```
77216
217+
### **Go**
218+
219+
```go
220+
func getCoprimes(nums []int, edges [][]int) []int {
221+
n := len(nums)
222+
g := make([][]int, n)
223+
f := [51][]int{}
224+
type pair struct{ first, second int }
225+
stks := [51][]pair{}
226+
for _, e := range edges {
227+
u, v := e[0], e[1]
228+
g[u] = append(g[u], v)
229+
g[v] = append(g[v], u)
230+
}
231+
for i := 1; i < 51; i++ {
232+
for j := 1; j < 51; j++ {
233+
if gcd(i, j) == 1 {
234+
f[i] = append(f[i], j)
235+
}
236+
}
237+
}
238+
ans := make([]int, n)
239+
var dfs func(i, fa, depth int)
240+
dfs = func(i, fa, depth int) {
241+
t, k := -1, -1
242+
for _, v := range f[nums[i]] {
243+
stk := stks[v]
244+
if len(stk) > 0 && stk[len(stk)-1].second > k {
245+
t, k = stk[len(stk)-1].first, stk[len(stk)-1].second
246+
}
247+
}
248+
ans[i] = t
249+
for _, j := range g[i] {
250+
if j != fa {
251+
stks[nums[i]] = append(stks[nums[i]], pair{i, depth})
252+
dfs(j, i, depth+1)
253+
stks[nums[i]] = stks[nums[i]][:len(stks[nums[i]])-1]
254+
}
255+
}
256+
}
257+
dfs(0, -1, 0)
258+
return ans
259+
}
260+
261+
func gcd(a, b int) int {
262+
if b == 0 {
263+
return a
264+
}
265+
return gcd(b, a%b)
266+
}
78267
```
79268

80269
### **...**

0 commit comments

Comments
 (0)