题目

解法: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相关推荐

  1. leetcode 368. Largest Divisible Subset | 368. 最大整除子集(动态规划详解)

    题目 https://leetcode.com/problems/largest-divisible-subset/ 哎,动态规划对我来说仍然是玄学- 只要有动态规划,medium is harder ...

  2. LeetCode Largest Divisible Subset(动态规划)

    题意:给出一个数组,找出子集合,使得每对可以除尽 思路:将数组从小到大排序,用动态规划方法 代码如下: public class Solution {public int[] largestDivis ...

  3. LintCode刷题——Largest Divisible Subset

    题目内容: Given a set of distinct positive integers, find the largest subset such that every pair (Si, S ...

  4. LeetCode——Kth Largest Element in an Array

    LeetCode--Kth Largest Element in an Array Question Find the kth largest element in an unsorted array ...

  5. LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字

    2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetco ...

  6. leetcode 368

    思路: 首先想到是排序,因为题目说si%sj ==0 或者 sj%si==0,为了方便,可以升序排序,之后就可以只判断 si%sj(i>=j)就可以了 dp[i] 表示0-i满足题目要求(也就是 ...

  7. LeetCode 84. Largest Rectangle in Histogram

    LeetCode 84. Largest Rectangle in Histogram Solution1:我的答案 循环里头套了一个动态规划,缺点是当heights个数或最大高度多高时会很耗时间!! ...

  8. 【回文串10】LeetCode 479. Largest Palindrome Product

    LeetCode 479. Largest Palindrome Product 本博客转载自:http://www.cnblogs.com/grandyang/p/7644725.html Solu ...

  9. [LeetCode]179. Largest Number

    [LeetCode]179. Largest Number 题目描述 解题思路 求最大的数,在数组中对于每一位数字数值越大应当越靠前,如:9 > 5,所以9应该在5之前 需要考虑的是对于不同位数 ...

最新文章

  1. 流形学习之LLE(LocallyLinearEmbedding)模型
  2. CentOS安装配置之基本
  3. spring无法扫描jar包的问题
  4. JavaScript实用小技巧
  5. insert select带来的问题
  6. fortran转换 matlab代码,将Fortran77代码转换为Matlab代码以查找特征值/向量
  7. 页表长度和页表大小_在请求调页系统中,若逻辑地址中的页号超过页表控制寄存器中的页表长度,则会引起( ) 。_学小易找答案...
  8. Linux下的段错误产生的原因及调试方法-转
  9. AppServ 介绍
  10. 我的2006总结:一个结束和一个开始
  11. 国内外低代码平台一览
  12. 专为存储设计的LRC编码
  13. 键盘映射keybmap工具使用
  14. 【HDL系列】半减器、全减器和减法器原理和设计
  15. 怎样将OFD转成PDF并保留电子签章
  16. PHP 将百度地图上的一条线的点位进行平滑处理,画出一条曲线
  17. Android Studio设置签名密钥
  18. php自测试卷2,PHP试题网
  19. Invalid bound statement (not found): com.cwp.study.dao.user.mapper.UserDao.selectByPrimaryKey解决办法
  20. shell脚本编程大全

热门文章

  1. 实现广告图片切换效果轮播图效果
  2. 模拟电路虚短 虚断
  3. 虚拟文件系统(无持久存储的文件系统),以proc和sysfs为例
  4. Excel中在方框里打钩
  5. 借助python用Tushare查询股票价格并存入Mysql数据库中
  6. 2022年度软考考试时间表已公布
  7. iOS App Thinning
  8. “异军突起”的蔷薇灵动或成云安全领域“独角兽”?
  9. 【深度学习】目标检测算法 YOLO 最耐心细致的讲解
  10. 大家来讨论怎么写概要设计