Leetcode 368. Largest Divisible Subset
题目
解法:dp
这道题目的关键在于想到一个subset在符合条件的情况下,如果另一个数字能够整除这个subset中最大的数字,证明这个数字能够被扩展到这个subset中,那么这就是一种子问题关系
- 将数组排序,保证在数字的某个位置,当前数字的所有因数或者能整除的数都在这个数前面,这样我们才能用上面提到的子问题关系
- dp状态转移方程:dp[i] = max(dp[j] + 1 for j < i and nums[i]%nums[j]==0)
- 同时由于需要返回最终的subset而不是长度,这边需要用到一个技巧,构建一个同等长度数组pre,这个数组i位置储存的是i位置的数字之前的那个数,这个之前的关系在哪边更新需要注意
- dp的同时用一个变量keep track那个最优subset中最大的数字,避免重复遍历
- 利用pre数字形成最终答案
class Solution {public:vector<int> largestDivisibleSubset(vector<int>& nums) {// sort the nums so that every number's divisible element number is before this number// only that we can use dpsort(nums.begin(),nums.end());// dp[i] means the larest length of subset that can be formed using nums[i] as the largest numbervector<int> dp(nums.size(),1);// since we need the subset it self rather than the length of the subset, we need an array to keep track the previous element in the largest subset// pre[a] = b, meaning the previous number before number at posistion a is at position bvector<int> pre(nums.size(),-1);int max_ = 0;int max_index = 0;for(int i=1;i<nums.size();i++){for(int j = i-1;j>=0;j--){if(nums[i]%nums[j] == 0){if(dp[j]+1 > dp[i]){pre[i] = j;dp[i] = dp[j] + 1;}}}// we also need to keep track of the position where the answer occurif(dp[i] > max_){max_ = dp[i];max_index = i;}}vector<int> ans;while(max_index >= 0){ans.push_back(nums[max_index]);max_index = pre[max_index];}return ans;}
};
时间复杂度:O(n^2)
空间复杂度:O(n)
参考:https://leetcode.com/problems/largest-divisible-subset/discuss/84006/Classic-DP-solution-similar-to-LIS-O(n2)
Leetcode 368. Largest Divisible Subset相关推荐
- leetcode 368. Largest Divisible Subset | 368. 最大整除子集(动态规划详解)
题目 https://leetcode.com/problems/largest-divisible-subset/ 哎,动态规划对我来说仍然是玄学- 只要有动态规划,medium is harder ...
- LeetCode Largest Divisible Subset(动态规划)
题意:给出一个数组,找出子集合,使得每对可以除尽 思路:将数组从小到大排序,用动态规划方法 代码如下: public class Solution {public int[] largestDivis ...
- LintCode刷题——Largest Divisible Subset
题目内容: Given a set of distinct positive integers, find the largest subset such that every pair (Si, S ...
- LeetCode——Kth Largest Element in an Array
LeetCode--Kth Largest Element in an Array Question Find the kth largest element in an unsorted array ...
- LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字
2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetco ...
- leetcode 368
思路: 首先想到是排序,因为题目说si%sj ==0 或者 sj%si==0,为了方便,可以升序排序,之后就可以只判断 si%sj(i>=j)就可以了 dp[i] 表示0-i满足题目要求(也就是 ...
- LeetCode 84. Largest Rectangle in Histogram
LeetCode 84. Largest Rectangle in Histogram Solution1:我的答案 循环里头套了一个动态规划,缺点是当heights个数或最大高度多高时会很耗时间!! ...
- 【回文串10】LeetCode 479. Largest Palindrome Product
LeetCode 479. Largest Palindrome Product 本博客转载自:http://www.cnblogs.com/grandyang/p/7644725.html Solu ...
- [LeetCode]179. Largest Number
[LeetCode]179. Largest Number 题目描述 解题思路 求最大的数,在数组中对于每一位数字数值越大应当越靠前,如:9 > 5,所以9应该在5之前 需要考虑的是对于不同位数 ...
最新文章
- 流形学习之LLE(LocallyLinearEmbedding)模型
- CentOS安装配置之基本
- spring无法扫描jar包的问题
- JavaScript实用小技巧
- insert select带来的问题
- fortran转换 matlab代码,将Fortran77代码转换为Matlab代码以查找特征值/向量
- 页表长度和页表大小_在请求调页系统中,若逻辑地址中的页号超过页表控制寄存器中的页表长度,则会引起( ) 。_学小易找答案...
- Linux下的段错误产生的原因及调试方法-转
- AppServ 介绍
- 我的2006总结:一个结束和一个开始
- 国内外低代码平台一览
- 专为存储设计的LRC编码
- 键盘映射keybmap工具使用
- 【HDL系列】半减器、全减器和减法器原理和设计
- 怎样将OFD转成PDF并保留电子签章
- PHP 将百度地图上的一条线的点位进行平滑处理,画出一条曲线
- Android Studio设置签名密钥
- php自测试卷2,PHP试题网
- Invalid bound statement (not found): com.cwp.study.dao.user.mapper.UserDao.selectByPrimaryKey解决办法
- shell脚本编程大全