Loading

【leetcode】368. Largest Divisible Subset

  Given a set of distinct positive integers nums, return the largest subset answer such that every pair (answer[i], answer[j]) of elements in this subset satisfies:

  • answer[i] % answer[j] == 0 or answer[j] % answer[i] == 0
  If there are multiple solutions, return any of them.
  
  首先可以先给数组排序,这样我们每次就只要看后面的数字能否整除前面的数字。定义一个动态数组dp,其中dp[i]表示到数字nums[i]位置最大可整除的子集合的长度,还需要一个一维数组parent,来保存上一个能整除的数字的位置,两个整型变量mx和mx_idx分别表示最大子集合的长度和起始数字的位置,我们可以从后往前遍历数组,对于某个数字再遍历到末尾,在这个过程中,如果nums[j]能整除nums[i], 且dp[i] < dp[j] + 1的话,更新dp[i]和parent[i],如果dp[i]大于mx了,还要更新mx和mx_idx,最后循环结束后,我们来填res数字,根据parent数组来找到每一个数字。  
 
  
class Solution {
public:
    vector<int> largestDivisibleSubset(vector<int>& nums) {
        // 思考一下 如果要写暴力发的话 如何处理 
        // 感觉 如果只需要计算 largest Divisible Subset的长度的话 可以直接动态规划
        // 如果还需要得到具体的数字的话 就还得存储一个数据的位置
        sort(nums.begin(),nums.end());
        vector<int>dp(nums.size(),0),parent(nums.size(),0),res;
        int mx=0,mx_idx=0;
        for(int i=nums.size()-1;i>=0;--i){
            for(int j=i;j<nums.size();++j){
                if(nums[j]%nums[i]==0 && dp[i]<dp[j]+1){
                    dp[i]=dp[j]+1;
                    parent[i]=j;
                    if(mx<dp[i]){
                        mx=dp[i];
                        mx_idx=i;
                    }       
                }
            }
        }
        for(int i=0;i<mx;++i){
            res.push_back(nums[mx_idx]);
            mx_idx=parent[mx_idx];
        }
        return res;  
    }
};

 

posted @ 2021-11-20 14:04  aalanwyr  阅读(28)  评论(0编辑  收藏  举报