LeetCode——368. 最大整除子集[Largest Divisible Subset][中等]——分析及代码[Java]
一、题目
给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:
- answer[i] % answer[j] == 0 ,或
- answer[j] % answer[i] == 0
如果存在多个有效解子集,返回其中任何一个均可。
示例 1:
输入:nums = [1,2,3]
输出:[1,2]
解释:[1,3] 也会被视为正确答案。
示例 2:
输入:nums = [1,2,4,8]
输出:[1,2,4,8]
提示:
- 1 <= nums.length <= 1000
- 1 <= nums[i] <= 2 * 10^9
- nums 中的所有整数 互不相同
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-divisible-subset
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 动态规划
(1)思路
对 nums 从小到大排序,设计一个动态规划数组 dp[i],表示前 i 个数字中以 nums[i] 为最大元素的整除子集最大大小。
其状态转移方程为,对索引在 [0, i-1] 区间内的数字 nums[j],若 nums[i] 能够被 nums[j] 整除(排序后 nums[i] > nums[j]),则 dp[i] 可以为 dp[j] + 1。
(2)代码
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums