Skip to content

Commit 59bf77a

Browse files
authored
feat: add solutions to lc problem: No.0368 (doocs#790)
No.0368.Largest Divisible Subset
1 parent ff28360 commit 59bf77a

File tree

4 files changed

+165
-4
lines changed

4 files changed

+165
-4
lines changed

solution/0300-0399/0368.Largest Divisible Subset/README.md

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,68 @@
5353
<!-- 这里可写当前语言的特殊实现逻辑 -->
5454

5555
```python
56-
56+
class Solution:
57+
def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
58+
nums.sort()
59+
n = len(nums)
60+
f, p = [0] * n, [0] * n
61+
for i in range(n):
62+
l, pre = 1, i
63+
for j in range(n):
64+
if nums[i] % nums[j] == 0 and f[j] + 1 > l:
65+
l = f[j] + 1
66+
pre = j
67+
f[i] = l
68+
p[i] = pre
69+
max_len, max_index = 0, 0
70+
for i, v in enumerate(f):
71+
if max_len < v:
72+
max_len = v
73+
max_index = i
74+
ans = []
75+
while len(ans) < max_len:
76+
ans.append(nums[max_index])
77+
max_index = p[max_index]
78+
return ans[::-1]
5779
```
5880

5981
### **Java**
6082

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

6385
```java
64-
86+
class Solution {
87+
public List<Integer> largestDivisibleSubset(int[] nums) {
88+
Arrays.sort(nums);
89+
int n = nums.length;
90+
int[] f = new int[n], p = new int[n];
91+
for (int i = 0; i < n; i++) {
92+
int l = 1, pre = i;
93+
for (int j = 0; j < i; j++) {
94+
if (nums[i] % nums[j] == 0 && f[j] + 1 > l) {
95+
l = f[j] + 1;
96+
pre = j;
97+
}
98+
}
99+
f[i] = l;
100+
p[i] = pre;
101+
}
102+
int maxLen = 0, maxIndex = 0;
103+
for (int i = 0; i < n; i++) {
104+
if (f[i] > maxLen) {
105+
maxLen = f[i];
106+
maxIndex = i;
107+
}
108+
}
109+
List<Integer> ans = new ArrayList<>();
110+
while (ans.size() < maxLen) {
111+
ans.add(nums[maxIndex]);
112+
maxIndex = p[maxIndex];
113+
}
114+
Collections.reverse(ans);
115+
return ans;
116+
}
117+
}
65118
```
66119

67120
### **...**

solution/0300-0399/0368.Largest Divisible Subset/README_EN.md

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,66 @@
4545
### **Python3**
4646

4747
```python
48-
48+
class Solution:
49+
def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
50+
nums.sort()
51+
n = len(nums)
52+
f, p = [0] * n, [0] * n
53+
for i in range(n):
54+
l, pre = 1, i
55+
for j in range(n):
56+
if nums[i] % nums[j] == 0 and f[j] + 1 > l:
57+
l = f[j] + 1
58+
pre = j
59+
f[i] = l
60+
p[i] = pre
61+
max_len, max_index = 0, 0
62+
for i, v in enumerate(f):
63+
if max_len < v:
64+
max_len = v
65+
max_index = i
66+
ans = []
67+
while len(ans) < max_len:
68+
ans.append(nums[max_index])
69+
max_index = p[max_index]
70+
return ans[::-1]
4971
```
5072

5173
### **Java**
5274

5375
```java
54-
76+
class Solution {
77+
public List<Integer> largestDivisibleSubset(int[] nums) {
78+
Arrays.sort(nums);
79+
int n = nums.length;
80+
int[] f = new int[n], p = new int[n];
81+
for (int i = 0; i < n; i++) {
82+
int l = 1, pre = i;
83+
for (int j = 0; j < i; j++) {
84+
if (nums[i] % nums[j] == 0 && f[j] + 1 > l) {
85+
l = f[j] + 1;
86+
pre = j;
87+
}
88+
}
89+
f[i] = l;
90+
p[i] = pre;
91+
}
92+
int maxLen = 0, maxIndex = 0;
93+
for (int i = 0; i < n; i++) {
94+
if (f[i] > maxLen) {
95+
maxLen = f[i];
96+
maxIndex = i;
97+
}
98+
}
99+
List<Integer> ans = new ArrayList<>();
100+
while (ans.size() < maxLen) {
101+
ans.add(nums[maxIndex]);
102+
maxIndex = p[maxIndex];
103+
}
104+
Collections.reverse(ans);
105+
return ans;
106+
}
107+
}
55108
```
56109

57110
### **...**
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
public List<Integer> largestDivisibleSubset(int[] nums) {
3+
Arrays.sort(nums);
4+
int n = nums.length;
5+
int[] f = new int[n], p = new int[n];
6+
for (int i = 0; i < n; i++) {
7+
int l = 1, pre = i;
8+
for (int j = 0; j < i; j++) {
9+
if (nums[i] % nums[j] == 0 && f[j] + 1 > l) {
10+
l = f[j] + 1;
11+
pre = j;
12+
}
13+
}
14+
f[i] = l;
15+
p[i] = pre;
16+
}
17+
int maxLen = 0, maxIndex = 0;
18+
for (int i = 0; i < n; i++) {
19+
if (f[i] > maxLen) {
20+
maxLen = f[i];
21+
maxIndex = i;
22+
}
23+
}
24+
List<Integer> ans = new ArrayList<>();
25+
while (ans.size() < maxLen) {
26+
ans.add(nums[maxIndex]);
27+
maxIndex = p[maxIndex];
28+
}
29+
Collections.reverse(ans);
30+
return ans;
31+
}
32+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution:
2+
def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
3+
nums.sort()
4+
n = len(nums)
5+
f, p = [0] * n, [0] * n
6+
for i in range(n):
7+
l, pre = 1, i
8+
for j in range(n):
9+
if nums[i] % nums[j] == 0 and f[j] + 1 > l:
10+
l = f[j] + 1
11+
pre = j
12+
f[i] = l
13+
p[i] = pre
14+
max_len, max_index = 0, 0
15+
for i, v in enumerate(f):
16+
if max_len < v:
17+
max_len = v
18+
max_index = i
19+
ans = []
20+
while len(ans) < max_len:
21+
ans.append(nums[max_index])
22+
max_index = p[max_index]
23+
return ans[::-1]

0 commit comments

Comments
 (0)