Largest Divisible Subset

题目链接: https://leetcode.com/problems/largest-divisible-subset/

Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of elements in this subset satisfies: Si % Sj = 0.

If there are multiple solutions, return any subset is fine.

Example 1:

nums: [1,2,3]

Result: [1,2] (of course, [1,3] will also be ok)

Example 2:

nums: [1,2,4,8]

Result: [1,2,4,8]

思路: 可以用动态规划来解决. 状态转移方程也很容易得到, 也就是当前数组如果能够整除以前的数字, 那么就可以用这个状态方程: dp[i] = max(dp[i], dp[j]+1);

然后还要知道最长的集合, 那么只需要记录一下第一个到达最大长度的那个数字位置即可, 然后找到这个位置之后再遍历一遍数组, 只要能够整除这个数的就加入结果集合中.

另外为了保证数组按照升序排列, 而且他也没提有序, 那就先排个序吧.

代码如下:

[cpp]  view plain  copy
 
  1. class Solution {  
  2. public:  
  3.     vector<int> largestDivisibleSubset(vector<int>& nums) {  
  4.         if(nums.size() ==0) return {};   
  5.         sort(nums.begin(), nums.end());  
  6.         vector<int> dp(nums.size(), 1), result;  
  7.         int curMax = 1, index = 0;  
  8.         for(int i =1; i < nums.size(); i++)  
  9.         {  
  10.             for(int j =0; j < i; j++)  
  11.             {  
  12.                 if(nums[i]%nums[j] ==0)  
  13.                 {  
  14.                     dp[i] = max(dp[i], dp[j]+1);  
  15.                     if(dp[i] > curMax) curMax = dp[i], index = i;  
  16.                 }  
  17.             }  
  18.         }  
  19.         for(int i = 0; i < nums.size(); i++)  
  20.             if(nums[index]%nums[i]==0) result.push_back(nums[i]);  
  21.         return result;  
  22.     }  
  23. };  

你可能感兴趣的:(Largest Divisible Subset)