Leetcode之 largest divisible set
来源:互联网 发布:淘宝客服要开通管理 编辑:程序博客网 时间:2024/06/01 08:54
题目
题目地址 :https://leetcode.com/problems/largest-divisible-subset/
题意解析
给定一个数组,这个数组数唯一且为正数,求在这个数组中,满足能整除的最大集合。
求解
很自然地想到用动态规划,因为满足重叠子问题和最优子结构
重叠子问题:整个数组的最大集合,可以认为是多个子问题组成的
最优子结构:反证法,显而易见。
定义最优解:最大集合是什么。
定义最优解的值:最大集合有多少个数。
定义 f[i]表示从0到i最大能整除集合里的个数。
递归式求解最优解的值:
f[i]= max{f[i],f[j]+1} if nums[i]%nums[j]==0
其中 j从i-1 downto 0
初始化条件:对于每个f[i],至少有i%i ==0;定义为1;
根据题意需要记录集合的内容,故需要记录每一步执行的index
Code
ac代码
import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;/** * Created by loveqh on 2016/8/13. */public class LargestDivisibleSet { public List<Integer> largestDivisibleSubset(int[] nums) { List<Integer> result = new ArrayList<Integer>(); Arrays.sort(nums); int[] f = new int[nums.length]; int[] pre = new int[nums.length]; int max = -1; int index = -1; //初始化f 和前导 for (int i = 0; i < f.length; i++) { f[i] = 1; pre[i] = -1; } if (nums.length == 1) { result.add(nums[0]); return result; } for (int i = 1; i < nums.length; i++) { //一轮循环,找到从0到i的可整除集合的长度 for (int j = i - 1; j >= 0; j--) { if (nums[i] % nums[j] == 0 && (f[i] < f[j] + 1)) { f[i] = f[j] + 1; //记录i的前导 pre[i] = j; } } //relax max的值 if (max < f[i]) { max = f[i]; index = i; } } if (index != -1) { result.add(nums[index]); } while (index > 0) { if (pre[index]!=-1){ result.add(nums[pre[index]]); index = pre[index]; }else { break; } } //求得的result为逆序的,应该转化为开始的样子 Collections.reverse(result); return result; } public static void main(String[] args) { int[] a = {546,669}; List<Integer> res = new LargestDivisibleSet().largestDivisibleSubset(a); for (Integer value : res) { System.out.print(value + " "); } }}
0 0
- Leetcode之 largest divisible set
- 【Leetcode】Largest Divisible Subset
- 【Leetcode】Largest Divisible Subset
- <LeetCode>Largest Divisible Subset
- Leetcode Largest Divisible Subset
- [LeetCode] Largest Divisible Subset
- [leetcode] 368. Largest Divisible Subset
- Leetcode 368. Largest Divisible Subset
- LeetCode 368. Largest Divisible Subset
- LeetCode 368 Largest Divisible Subset
- leetcode 368. Largest Divisible Subset
- [leetcode] 368. Largest Divisible Subset
- leetcode.368. Largest Divisible Subset
- LeetCode 368: Largest Divisible Subset
- [Leetcode]368. Largest Divisible Subset
- LeetCode[368] Largest Divisible Subset
- [leetcode] 368. Largest Divisible Subset
- leetcode 368. Largest Divisible Subset
- ubuntu下安装QT的全过程
- Hadoop和Spark生态圈了解
- Android开发——减小APK大小
- linux read 用法
- Android Studio中关联SVN进行版本控制(三)如何更改文件名
- Leetcode之 largest divisible set
- Java -- 常用的JNI接口函数简介(一)
- 位运算(2)-- 集合中的位运算
- swift 当需要改变cell的内容布局时
- 123452345678
- 小方法1——CountChar--统计一个字符串中每个字符出现的次数
- Hibernate关联映射之一对多,多对一以及双向一对多
- 量化分析师的Python日记
- lintcode178. graph valid tree 图是否是树