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:
**Input:** [1,2,3] **Output:** [1,2] (of course, [1,3] will also be ok)
Example 2:
**Input:** [1,2,4,8] **Output:** [1,2,4,8]
题目大意:
一个数组,让我们求这样一个子集合,集合中的任意两个数相互取余均为0。
解题思路:
由于知道子问题有助于求解考虑用DP。它就是LIS的翻版。这道题还需要打印DP路径。
- 定义dp[i]为num[i-1]这个数对应的最大可整除子集合个数。
- 递归式为dp[i] = max{dp[j-1] + 1}, 0<j<i, 若num[i-1]可被num[j-1]整除
- 方向为从左到右。初始值为dp = 1。
- path数组记录解的下标+1,每求得一个解dp[i] = dp[j] + 1就记录对应上一层解的下标,也就是到此解的路径。
注意事项:
- 初始值dp = 1。
Java代码:
1 | public List<Integer> largestDivisibleSubset(int[] nums) { |
算法分析:
时间复杂度为O(n2)
,空间复杂度O(n2)
。