[LeetCode] 368. Largest Divisible Subset
2018-01-09 23:08
363 查看
[LeetCode] 368. 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 or Sj % Si = 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[vec[i]] = max(dp[vec[i]], dp[vec[j]] + 1) (i = 1 - n, j = i - n, vec[j] mod vec[i] = 0, vec经过排序)。先给数组排序,这样我们每次就只要看后面的数字能否整除前面的数字。定义一个动态数组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) { 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; } };
相关文章推荐
- leetcode78 subset
- [LeetCode]Partition Equal Subset Sum
- LeetCode Partition Equal Subset Sum
- [LeetCode] 416. Partition Equal Subset Sum 解题报告
- 【Leetcode】之Subset II
- leetcode 368. Largest Divisible Subset
- 【leetcode】416. Partition Equal Subset Sum
- leetcode-416-Partition Equal Subset Sum
- [leetcode] 368. Largest Divisible Subset 解题报告
- Leetcode: 368. Largest Divisible Subset
- [LeetCode]Partition Equal Subset Sum(Java)
- Leetcode: Partition Equal Subset Sum
- [LeetCode]:动态规划+回溯 Largest Divisible Subset 最大可整除的子集合
- LeetCode #416: Partition Equal Subset Sum
- leetcode之subset II
- LeetCode--Largest Divisible Subset
- [leetcode] 368. Largest Divisible Subset
- LeetCode Largest Divisible Subset
- LeetCode "Largest Divisible Subset" !
- (Java) LeetCode 416. Partition Equal Subset Sum —— 分割等和子集