当前位置: 首页 > news >正文

算法题(动态规划)

一、题目1、完全平方数LC 2792、零钱兑换LC 322二、题解1、完全平方数LC 2791分析要求用最少的完全平方数比如 1、4、9 等相加得到给定数字 n是一个典型的最小数量选择问题都是求 “最少个数”可以选择用记忆化深度优先搜索 来做。把问题转化成一个递归选择问题对于每一个平方数我们可以选择用它或者不用它然后在所有合法方案里取数量最少的那一个。先把最大可能用到的平方数的平方根算出来比如 n12最大平方数是 9平方根就是 3这样递归时就知道要考虑哪些数字。递归函数里有两个关键参数i 表示当前考虑到第几个平方数j 表示当前还需要凑出的数字。递归的边界很清晰如果 i 等于 0说明已经没有平方数可以选了这时候如果 j 也等于 0就代表成功凑出来返回 0否则返回一个很大的值表示方案不合法。为了避免大量重复递归导致超时可以用一个 memo 数组记录已经算过的状态数组里存的是对应状态下需要的最少平方数个数。如果某个状态已经算过就直接返回结果不用再重复递归。在递归过程中如果当前剩余数字 j 比当前平方数还小那就不能选这个平方数只能跳过考虑下一个。如果可以选就分两种情况不选当前平方数直接递归下一个或者选当前平方数用掉它之后继续递归两种方案取最小值。2解答class Solution { static int[][] memo new int[101][10001]; //每种情况所需个数 meno[3][12]表示对12这个数用1、4、9需要多少个 static { for(int[] row : memo){ Arrays.fill(row,-1); //初始化为-1表示没有计算过 } } public int numSquares(int n) { return dfs((int)Math.sqrt(n), n); } public int dfs(int i, int j){ if(i 0){ return j 0 ? 0 : Integer.MAX_VALUE/2; //边界i0,j0,返回0如果j不为0说明不合法 } if(memo[i][j] ! -1){ return memo[i][j]; } if(j i*i){ return memo[i][j] dfs(i - 1, j); //不选择当前平方数考虑下一个 } return memo[i][j] Math.min(dfs(i-1, j), dfs(i, j - i*i)1); //选择和不选择的情况选取个数最小的 } }2、零钱兑换LC 3221分析用最少数量的硬币凑出指定金额和完全平方数几乎是同一个模型同样使用了记忆化 DFS来实现。思路是对每一种硬币做两种选择要么不使用当前硬币要么使用它然后在两种选择里取硬币数量最少的那一个。递归函数有两个关键参数i 表示当前处理到第几个硬币c 表示还需要凑多少钱。这样每一步都在缩小问题规模直到到达边界。递归的边界条件如果 i 小于 0说明已经没有硬币可以选了这时候如果 c 等于 0就代表凑成了返回 0否则返回一个较大的值表示方案无效。使用一个二维 memo 数组记录已经算过的状态只要算过就直接读取结果不再重复递归。在递归过程中如果当前需要凑的钱比硬币面值还小那就不能选这个硬币只能跳过。如果可以选就比较两种方案不选当前硬币直接递归下一个或者选当前硬币金额减少后继续递归并且硬币数加一。两种方案取最小值。最后判断结果是否有效有效就返回无效返回 - 1。2解答class Solution { public int coinChange(int[] coins, int amount) { int n coins.length; int[][] memo new int[n][amount 1]; for (int[] row : memo) { Arrays.fill(row, -1); // -1 表示没有计算过 } int ans dfs(n - 1, amount, coins, memo); return ans Integer.MAX_VALUE / 2 ? ans : -1; } private int dfs(int i, int c, int[] coins, int[][] memo) { if (i 0) { return c 0 ? 0 : Integer.MAX_VALUE / 2; // 除 2 防止下面 1 溢出 } if (memo[i][c] ! -1) { // 之前计算过 return memo[i][c]; } if (c coins[i]) { // 只能不选 return memo[i][c] dfs(i - 1, c, coins, memo); } // 不选 vs 继续选 return memo[i][c] Math.min(dfs(i - 1, c, coins, memo), dfs(i, c - coins[i], coins, memo) 1); } }
http://www.zskr.cn/news/1334718.html

相关文章:

  • 从模拟到数字:Sigma-Delta调制器如何成为现代ADC的降噪利器?
  • XRSLAM:开源视觉惯性里程计库,赋能移动端AR应用开发
  • 炒股炒的是什么?这几个真相,可能和你想象的完全不同
  • Scroll Reverser:终极Mac滚动控制解决方案,让触控板和鼠标拥有独立滚动方向
  • PptxGenJS:JavaScript自动化PPT生成的3大应用场景与4个核心模块全解析
  • 【数据结构】顺序表
  • 5大过程组、十大知识领域和49个子过程的英文拼写
  • 惠来海康医院眼科第三十六个全国助残日公益助残行动
  • Mac终极指南:3步免费备份微信聊天记录,永久保存珍贵回忆
  • TaotokenAPI密钥的精细化权限管理与审计日志查看体验
  • 如何通过 Tailscale SSH 功能安全远程连接 Linux 服务器
  • 终极解决方案:pdf2pptx让LaTeX PDF幻灯片在PowerPoint中完美展示
  • 负载型聚丙烯酰胺PAM水凝胶:构筑多功能智能材料的新范式
  • 好书推荐《VirtualLab Fusion入门与进阶实用教程(第二版)》
  • 菩瓦纽课业平台:少刷无用题,专攻薄弱点,让高效提分不内卷
  • 推荐1款全能跨平台下载工具,免费、开源、无广告!
  • 别再乱升级了!手把手教你排查Java国密SM2/3/4项目中的BouncyCastle版本兼容性问题
  • Larfe拉孚AI节能算法在化工、电力等不同行业的具体应用案例和节能效果对比
  • 猫抓浏览器扩展:3分钟学会免费下载在线视频的完整指南 [特殊字符]
  • python学习笔记 | 11.2、面向对象高级编程-使用@property
  • 中兴B862AV3.2M盒子救砖记:免拆机免ADB,一根双公头线搞定刷机变砖
  • SQL时间盲注实战:从手工探测到Sqlmap自动化,一份完整的Sqli-Labs靶场通关指南
  • 【PI_电源环路】前馈电容Cff对电源环路影响分析
  • 2026年Q2物业托管技术落地要点与靠谱服务商解析 - 优质品牌商家
  • 英雄联盟Akari助手:3大核心价值与5步快速入门完整指南
  • 外部系统调用SAP数据?用ABAP RFC函数搭个“桥梁”其实很简单(含Function Group创建避坑)
  • 终极字体设计指南:如何用免费开源工具打造专业级字体
  • 喜马拉雅音频下载器:三分钟学会下载付费专辑的完整方案
  • 多场景互动抽奖公众号管理系统
  • 限时解锁!Midjourney Pro用户专享的「智能相机预设库」:含21套按焦段(16mm广角→135mm长焦)与场景(夜景/逆光/微距)精准匹配的参数包