leetcode 368. 最大整除子集(dp)
给你一个由 无重复 正整数组成的集合 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 * 109
nums 中的所有整数 互不相同
解题思路
从小到大进行排序,每次判断两个元素的整除关系时,只需要枚举前面元素,判断是否存在整除关系即可。
因为整除关系存在传递性,例如1,2,4,8,16,16整除8以外,同时也能整除能被8整除的元素(例如 1,2,4)
因此只需要一个一维数组记录当前元素能够整除元素的个数
状态转移方程为:
for j,v:=range nums[:i] {//遍历前面元素if nums[i]%v==0&&dp[j]+1>dp[i]{//当前nums[j]可以被nums[i]整除dp[i]=dp[j]+1//因此与nums[j]有整除关系的,与nums[i]也存在相同的整除关系 //加一是因为与nums[i]与nums[j]也存在整除关系}}
代码
func largestDivisibleSubset(nums []int) []int {sort.Ints(nums)n := len(nums)dp := make([]int, n)for i:=range dp{dp[i]=1}maxS,maxV:=1,nums[0]for i := 1; i < n; i++ {for j,v:=range nums[:i] {if nums[i]%v==0&&dp[j]+1>dp[i]{dp[i]=dp[j]+1}}if dp[i]>maxS{maxS,maxV=dp[i],nums[i]}}var res []intif maxS==1{res=append(res,maxV)return res}for i := n-1; i >=0 ; i-- {if maxS>0&&maxV%nums[i]==0&&dp[i]==maxS{maxS--maxV=nums[i]res=append(res,maxV)}}return res}
leetcode 368. 最大整除子集(dp)相关推荐
- leetcode - 368. 最大整除子集
解题思路:这一题如果是简单的求最长的整除子集的个数的话,是很简单的一个题目,但是题目要求返回最长的整除子集,这时候就得考虑使用更多的内存去存储更多的信息了.这道题使用两部分的容易去存储信息.dp[i] ...
- LeetCode 368. 最大整除子集(动态规划)
题目描述 给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0. 如果有多个目标子集,返回其中任何一 ...
- leetcode 368. Largest Divisible Subset | 368. 最大整除子集(动态规划详解)
题目 https://leetcode.com/problems/largest-divisible-subset/ 哎,动态规划对我来说仍然是玄学- 只要有动态规划,medium is harder ...
- leetcode 368
思路: 首先想到是排序,因为题目说si%sj ==0 或者 sj%si==0,为了方便,可以升序排序,之后就可以只判断 si%sj(i>=j)就可以了 dp[i] 表示0-i满足题目要求(也就是 ...
- loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】
题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...
- LeetCode 85. 最大矩形(DP/单调递增栈,难)
文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调递增栈 1. 题目 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [[" ...
- LeetCode 221. 最大正方形(DP)
文章目录 1. 题目信息 2. 解题 1. 题目信息 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 来源:力扣(LeetCode) 链接:https:/ ...
- BZOJ 2560(子集DP+容斥原理)
2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 757 Solved: 497 [Submit][Status][Discuss ...
- leetcode算法题--最大整除子集
原题链接:https://leetcode-cn.com/problems/largest-divisible-subset/ 首先给数组排序,然后用动态规划 dp[i]表示以nums[i]结尾的序列 ...
最新文章
- Java线程池使用与原理
- Oracle Database 11.2.0.1(静默安装)
- number类型的数组
- alexnet 论文翻译
- python bs4模块_python爬虫之Beautifulsoup模块用法详解
- OCP之5 管理数据库存储结构
- 计算机图形学Web前端笔记-定位并移动到指定坐标点(two.js理论及实现)
- 5分钟制作Unity过场动画 | Timeline
- ipv6远程连接mysql_如何利用IPv6进行远程桌面连接
- Python自动化开发学习的第九周----线程、进程、协程
- 判断double_深入解析单例模式之懒汉模式---Double-Check及volatile关键字
- (我总结的实用主义)Loadrunner运行常见错误
- 软件技术方案模板_携手跨越,法本信息数字化解决方案赋能企业,共建数字未来...
- 倍福PLC使用Visualization功能实现可视化界面
- 塔菲克蓝牙适配器驱动_TAFIQ蓝牙适配器驱动下载
- android之仿朋友圈程序,Android仿微信朋友圈添加图片的实例代码
- windows10打开natapp.exe 报Error: oppen NUL: The system cannot find the file specified.
- fash 3D 游戏
- html5标签思维导图,HTML/HTML5 知识点思维导图
- 阿里云,AWS,HTTPS和企业支付宝配置