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

网站建设伍金手指下拉3渔泡建筑网

网站建设伍金手指下拉3,渔泡建筑网,营销资源网,网站电子报怎么做198. 打家劫舍 https://leetcode.cn/problems/house-robber/description/ dp[i] 表示 考虑到下标为 i #xff08;包括i#xff09;的房子#xff0c;可以偷到的最大金额。 dp[i] 有两个状态#xff0c;分别是 偷 和 不偷。 偷#xff0c;则需要考虑前 i-2 天的最大金额…198. 打家劫舍 https://leetcode.cn/problems/house-robber/description/ dp[i] 表示 考虑到下标为 i 包括i的房子可以偷到的最大金额。 dp[i] 有两个状态分别是 偷 和 不偷。 偷则需要考虑前 i-2 天的最大金额 nums[1]。 不偷则考虑 i-1 天的最大金额即可。 那么递推公式应为dp[i] max(dp[i-2] nums[i], dp[i-1]) dp[0] nums[0], dp[1] max(nums[0], nums[1]) class Solution {public int rob(int[] nums) {if (nums.length 1) {return nums[0];}int[] dp new int[nums.length];dp[0] nums[0];dp[1] Math.max(nums[0], nums[1]);for (int i 2; i nums.length; i) {dp[i] Math.max(dp[i-2] nums[i], dp[i-1]);// System.out.println(Arrays.toString(dp));}return dp[nums.length - 1];} }213. 打家劫舍 II 房子首尾相连只有三种情况 第一首尾均不偷 第二考虑偷首尾不能投 第三首不能投考虑偷尾 第二种和第三种情况包含第一种情况。 两种情况其实就是上一题的思路。 class Solution {public int rob(int[] nums) {if (nums null || nums.length 0) return 0;if (nums.length 1) return nums[0];// 首尾相连只需要考虑两种情况考虑包含首元素和考虑包含尾元素int res1 robHelper(nums, 0, nums.length - 1);int res2 robHelper(nums, 1, nums.length);return Math.max(res1, res2);}private int robHelper(int[] nums, int start, int end) {if (start end - 1) return nums[start];int[] dp new int[nums.length];dp[start] nums[start];dp[start 1] Math.max(nums[start], nums[start 1]);for (int i start 2; i end; i) {dp[i] Math.max(dp[i - 2] nums[i], dp[i - 1]);// System.out.println(Arrays.toString(dp));}return dp[end - 1];} }337. 打家劫舍 III 暴力递归 and 记忆化递归 每个节点有两种状态偷和不偷 偷则不能偷左右子节点 不偷则可以考虑偷左右子节点注意是考虑也有可能不偷。 MapTreeNode, Integer map new HashMap(); public int rob2(TreeNode root) {// 记忆化递归, 1msif (root null) return 0;if (root.left null root.right null) return root.val;if (map.containsKey(root)) return map.get(root);// 偷父节点int val1 root.val;if (root.left ! null) val1 rob(root.left.left) rob(root.left.right);if (root.right ! null) val1 rob(root.right.left) rob(root.right.right);// 不偷父节点int val2 rob(root.left) rob(root.right);map.put(root, Math.max(val1, val2));return Math.max(val1, val2); }动态规划 这道题目算是树形dp的入门题目因为是在树上进行状态转移我们在讲解二叉树的时候说过递归三部曲那么下面我以递归三部曲为框架其中融合动规五部曲的内容来进行讲解。 确定递归函数的参数和返回值 其实这里的返回数组就是dp数组。 所以dp数组dp table以及下标的含义下标为0记录不偷该节点所得到的的最大金钱下标为1记录偷该节点所得到的的最大金钱。所以本题dp数组就是一个长度为2的数组 而且递归的每一层都会保存当前节点的 dp 数组 确定终止条件 即当参数 root 为 null 时返回[0, 0] 数组 确定遍历顺序 一定是后续遍历因为需要递归返回值来做下一步计算。 通过递归左节点得到左节点偷与不偷的金钱。 通过递归右节点得到右节点偷与不偷的金钱。 确定单层递归的逻辑 如果是偷当前节点那么左右孩子就不能偷val1 root.val left[0] right[0]; 如果对下标含义不理解就再回顾一下dp数组的含义 如果不偷当前节点那么考虑偷左右孩子即取其中最大的即可 val2 max(left[0], left[1]) max(right[0], right[1]) 最后当前节点的状态就是{val2, val1}; 即{不偷当前节点得到的最大金钱偷当前节点得到的最大金钱} 举例推导dp数组 class Solution {public int rob(TreeNode root) {int[] res robTree(root);return Math.max(res[0], res[1]);}private int[] robTree(TreeNode root) {if (root null) return new int[]{0, 0};// 后续遍历int[] left robTree(root.left);int[] right robTree(root.right);// 偷当前节点那么就不能偷左右节点。int val1 root.val left[0] right[0];// 不偷当前节点那么就考虑偷左右节点可偷可不偷即取较大的情况int val2 Math.max(left[0], left[1]) Math.max(right[0], right[1]);return new int[]{val2, val1};} }
http://www.huolong8.cn/news/248036/

相关文章:

  • 网站建设排名北京188网站开发
  • 建设银行投诉网站首页华安网站建设
  • 爱用建站正规吗张掖网站建设培训
  • 微信网站开发语言手机在线app下载
  • 怎么做能上谷歌网站吗免费的推广网站
  • 下载网站站开发页面设计需求需要做哪些方面?
  • 微网站开发wordpress xml
  • 怎么建设公司的网站googleseo是什么
  • 销售部网站建设费昆山开发区网站制作
  • 网站程序制作软件产品网站用什么软件做
  • 南昌网站建设网站推广九九建筑网登入
  • 无锡网站建设技术怎么把dw做的网站传上去
  • 公司网站维护内容织梦做的网站图片路径在哪
  • 网站域名改了以后新域名301wordpress菜单消失
  • 宠物狗网站建设分析怎么创建wordpress站点
  • wordpress建手机网站从零开始网页制作教程
  • 频繁从一个网站链接到另一个网站会影响百度收录么网页的网站建设
  • 高青云速网站建设京东自营入驻流程及费用
  • 移动的网络网站建设怎么查一个网站有没有做301
  • 传媒网站后台免费模板一键优化清理加速
  • h5网站开发软件下载中山网红打卡点
  • 站长工具seo综合查询怎么使用的广州模板网站建设费用
  • 找做玻璃的网站wordpress js手工合并
  • 网站技术培训学校太原app制作
  • 秦皇岛网站建设哪里有潍坊高端网站设计
  • 物流网站和数据库建设坑梓网站建设方案
  • 青岛网站建设公司有哪些网站开发设计参考文献
  • 青岛网站制作套餐营销型网站设计工资
  • 网站seo优化心得wordpress自动采集发布插件
  • 南通网站建设报价设计师个人作品展示网站