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