๐ŸŒ• 368. ๆœ€ๅคงๆ•ด้™คๅญ้›†

ๅžไฝ›็ซฅๅญ2022ๅนด10ๆœˆ10ๆ—ฅ
  • algorithm
  • dp
ๅฐไบŽ 1 ๅˆ†้’Ÿ

๐ŸŒ• 368. ๆœ€ๅคงๆ•ด้™คๅญ้›†

้šพๅบฆ: ๐ŸŒ•

้—ฎ้ข˜ๆ่ฟฐ

img_7.png


่งฃๆณ•

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;
    }
}

่พ“ๅ‡บ

img_6.png

ไธŠๆฌก็ผ–่พ‘ไบŽ: 2022/10/10 ไธ‹ๅˆ8:43:48
่ดก็Œฎ่€…: liuxianzhishou