首页 > 编程语言 >代码随想录算法训练营 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III

代码随想录算法训练营 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III

时间:2024-10-13 19:43:52浏览次数:6  
标签:198 nums int 随想录 start length 打家劫舍 dp

198.打家劫舍
题目链接:198.打家劫舍
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰打家劫舍
日期:2024-10-13

想法:dp[i]到第i个房子时能偷的最多的钱;递推公式:是上上一栋房子的dp[i - 2]加上这栋房子的钱nums[i]大还是上一家邻居偷的钱dp[i - 1]的大;初始化因为有i - 2;所以初始化dp[0]和dp[1];顺序,从前往后;打印。
Java代码如下:

class Solution {
    public int rob(int[] nums) {
        if(nums.length == 0) return 0;
        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 - 1], dp[i - 2] + nums[i]);
        }
        return dp[nums.length - 1];
    }
}

213.打家劫舍II
题目链接:213.打家劫舍II
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰打家劫舍II
日期:2024-10-13

想法:因为首尾相连,所以nums得分两种情况,要头不要尾和要尾不要头,rob1(nums, 0, nums.length - 2)和rob1(nums, 1, nums.length - 1)这两种,注意start = end的时候要返回nums[start]
Java代码如下:

class Solution {
    public int rob1(int[] nums, int start, int end) {
        if(start == end) 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 - 1], dp[i - 2] + nums[i]);
        }
        return dp[end];
    }

    public int rob(int[] nums) {
        if(nums.length == 0) return 0;
        if(nums.length == 1) return nums[0];
        int res1 = rob1(nums, 0, nums.length - 2);
        int res2 = rob1(nums, 1, nums.length - 1);
        return Math.max(res1, res2);
    }
}

337.打家劫舍III
题目链接:337.打家劫舍III
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰打家劫舍III
日期:2024-10-13

想法:dp[0]表示不抢当前节点的最大钱,dp[1]为抢,后序遍历。
Java代码如下:

class Solution {
    public int rob(TreeNode root) {
        int[] dp = rob1(root);
        return Math.max(dp[0], dp[1]);
    }
    public int[] rob1(TreeNode root) {
        int[] dp = new int[2];
        if(root == null) return dp;
        int[] left = rob1(root.left);
        int[] right = rob1(root.right);
        dp[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        dp[1] = root.val + left[0] + right[0];
        return dp;
    }
}

标签:198,nums,int,随想录,start,length,打家劫舍,dp
From: https://www.cnblogs.com/wowoioo/p/18462833

相关文章

  • 【代码随想录Day41】动态规划Part10
    300.最长递增子序列题目链接/文章讲解:代码随想录视频讲解:动态规划之子序列问题,元素不连续!|LeetCode:300.最长递增子序列_哔哩哔哩_bilibilipublicintlengthOfLIS(int[]nums){//获取数组的长度intn=nums.length;//创建一个用于存储以每个元素结......
  • 代码随想录Day24 | LeetCode 122. 买卖股票的最佳时机 II、LeetCode 55. 跳跃游戏、Le
    LeetCode122.买卖股票的最佳时机IIclassSolution:defmaxProfit(self,prices:List[int])->int:res=0foriinrange(1,len(prices)):res+=max(0,prices[i]-prices[i-1])returnresLeetCode55.跳跃游戏class......
  • CF1988C. Increasing Sequence with Fixed OR
    链接:    https://codeforces.com/problemset/problem/1988/Chttps://codeforces.com/problemset/problem/1988/C大意:    给定一个n,找一个最长的正整数递增序列,并满足相邻或等于n思路:    1、显然是要分析二进制方面的规律        2、首先......
  • 代码随想录算法训练营 | 322. 零钱兑换,279.完全平方数,139.单词拆分
    322.零钱兑换题目链接:322.零钱兑换文档讲解︰代码随想录(programmercarl.com)视频讲解︰零钱兑换日期:2024-10-12想法:完全背包,注意初始化除dp[0]外都要置为Integer.MAX_VALUE,才能后面选出最小值,还有判断dp[j-coins[i]]!=Integer.MAX_VALUE,不成立的化代表除去coins[i]后,没有......
  • 代码随想录算法训练营第十天|Day10栈与队列
    232.用栈实现队列题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html思路这是一道模拟题,不涉及到具体算法,使用栈来模拟队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出......
  • 代码随想录算法训练营第十二天|Day12二叉树
    递归遍历 题目链接/文章讲解/视频讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html思路每次写递归,按照三要素来写,可以写出正确的递归算法!确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要......
  • 代码随想录算法训练营第十一天|Day11栈与队列
    150.逆波兰表达式求值题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html思路#defineMAX_TOKENS1000#defineMAX_TOKEN_LEN10typedefstruct{longlongdat......
  • 代码随想录算法训练营第十三天|Day13二叉树
    226.翻转二叉树题目链接/文章讲解/视频讲解:https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html思路只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果递归法structTreeNode*invertTree(structTreeNode*root){if(!......
  • 代码随想录训练营第五天|Leetcode.349,Leetcode.454,Leetcode19,Leetcode18
    一、哈希表和set和map和数组的关系 用哈希表,判断是否出现过。数值很大或者数值很分散时,不用数组,占用空间大,用set。set,multiset数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判......
  • 代码随想录训练营第60天|冗余连接
    108.冗余连接#include<iostream>#include<vector>usingnamespacestd;intn;//节点数量vector<int>father(1001,0);//按照节点大小范围定义数组//并查集初始化voidinit(){for(inti=0;i<=n;++i){father[i]=i;}}//并查集......