๐ 368. ๆๅคงๆด้คๅญ้
2022ๅนด10ๆ10ๆฅ
- algorithm
๐ 368. ๆๅคงๆด้คๅญ้
้พๅบฆ: ๐
้ฎ้ขๆ่ฟฐ
่งฃๆณ
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
// ๆ่ทฏ๏ผ
// dp - ้ฆๅ
ๆพๅฐๆๅคงๆด้คๅญ้็้ฟๅบฆ
// ๆ นๆฎๆ้ฟๅญ้็้ฟๅบฆไพๆฌกๅพๅๆพๅ้ข็ๅ
็ด
Arrays.sort(nums); // ๅ
ๆๅบ
int len = nums.length;
int[] dp = new int[len];
Arrays.fill(dp, 1);
int count = 1;
int val = nums[0];
int index = 0;
// dp
for(int i = 1; i < len; i ++) {
int cur = nums[i]; // ๆพไปฅ cur ไธบๆๅๅ
็ด ็ๆด้คๅญ้
for(int j = 0; j < i; j ++) {
if(cur % nums[j] == 0) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
// ๅคๆญๆฏๅฆๆดๆฐๆๅคงๅญ้้ฟๅบฆ
if(dp[i] > count) {
count = dp[i];
val = cur;
index = i;
}
}
// ็กฎๅฎ dp[i] ๅ๏ผๅกซๅ
res
ArrayList<Integer> res = new ArrayList<>();
// ๅ
ๅฐๆๅไธไธชๅ
็ด ๅ ๅ
ฅ็ปๆ้ไธญ
res.add(val);
count --;
// ไปๅๅพๅๆพ
for(int i = index - 1; i >= 0; i --) {
if(dp[i] == count && val % nums[i] == 0) {
count --;
res.add(nums[i]);
val = nums[i];
}
}
return res;
}
}