算法刷题记录 Day41

算法刷题记录 Day41

Date: 2024.04.08

lc 337. 打家劫舍III

struct Money{
    int take_cur;
    int not_take_cur;
};

class Solution {
public:
    // 每个节点需要返回偷了的最大值,和没偷的最大值。
    Money traverse(TreeNode* root, Money cur_money){
        Money res;
        res.take_cur = 0;
        res.not_take_cur = 0;
        if(root == nullptr) return res;

        Money left = traverse(root->left, cur_money);
        Money right = traverse(root->right, cur_money);

        // 两种选择,一种是取当前节点,则其子节点必不能取;另一种是不取当前节点,则其子节点选取或不取的更大值;
        res.take_cur = root->val + left.not_take_cur + right.not_take_cur;
        res.not_take_cur = max(left.take_cur, left.not_take_cur) + max(right.take_cur, right.not_take_cur);
        return res;
        
    }


    int rob(TreeNode* root) {
        if(root == nullptr) return 0;

        // 遍历方式:后序遍历(自底向上);
        Money tmp;
        tmp.take_cur = 0;
        tmp.not_take_cur = 0;
        Money res = traverse(root, tmp);
        return max(res.take_cur, res.not_take_cur);
    }
};

lc 213. 打家劫舍II

class Solution {
public:
    // 思路1:分别计算包含第一个和包含最后一个的值,取两者更大的值;
    int takeMoney(vector<int>& nums, int startIdx, int endIdx){
        int n = endIdx - startIdx + 1;
        if(n == 1)  return nums[startIdx];
        vector<int> dp(n, 0);
        dp[0] = nums[startIdx];
        dp[1] = max(nums[startIdx], nums[startIdx+1]);

        for(int i=2; i<n; i++){
            dp[i] = max(dp[i-1], dp[i-2]+nums[startIdx+i]);
        }
        return dp[n-1];

    }

    int rob(vector<int>& nums) {
        int n = nums.size();
        if(n == 1)  return nums[0];
        vector<int> dp(n, 0);
        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);

        int res1 = takeMoney(nums, 0, n-2);
        int res2 = takeMoney(nums, 1, n-1);
        return max(res1, res2);
    }
};

lc 198. 打家劫舍

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if(n == 1)  return nums[0];
        // 我们需要确定要不要取当前的房间内的金币。取的代价是左右都不能再取。
        // dp[i]表示从前i个房间偷盗后,能获得的最高的金额;
        vector<int> dp(n, 0);
        // 最多跳两个,不可能跳三个;
        // 1.前一个没取,取当前的;2.前一个取了,当前的跳过;3.前一个没取,当前的跳过;
        // dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);

        for(int i=2; i<n; i++){
            dp[i] = max(dp[i-2], max(dp[i-2]+nums[i], dp[i-1]));
        }
        return dp[n-1];

    }
};

相关推荐

  1. 算法记录 Day41

    2024-04-09 17:34:01       40 阅读
  2. 算法记录 Day40

    2024-04-09 17:34:01       33 阅读
  3. 算法记录 Day46

    2024-04-09 17:34:01       39 阅读
  4. 算法记录 Day45

    2024-04-09 17:34:01       40 阅读
  5. 算法day42

    2024-04-09 17:34:01       28 阅读
  6. 算法day44

    2024-04-09 17:34:01       36 阅读
  7. 算法day45

    2024-04-09 17:34:01       34 阅读
  8. 算法记录 Day25

    2024-04-09 17:34:01       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 17:34:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 17:34:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 17:34:01       82 阅读
  4. Python语言-面向对象

    2024-04-09 17:34:01       91 阅读

热门阅读

  1. 外观模式(面子模式)

    2024-04-09 17:34:01       33 阅读
  2. uni-app中的地图简单说明 map

    2024-04-09 17:34:01       29 阅读
  3. 文本转语音常用的几个python库

    2024-04-09 17:34:01       31 阅读
  4. 【AIGC调研系列】在手机上运行的Octopusv2模型

    2024-04-09 17:34:01       44 阅读
  5. 2024年下半年软考考试科目有哪些?

    2024-04-09 17:34:01       43 阅读
  6. MySql01

    MySql01

    2024-04-09 17:34:01      31 阅读
  7. mapbox 工作问题暂时记录

    2024-04-09 17:34:01       32 阅读
  8. golang 协程池 动态扩缩容

    2024-04-09 17:34:01       32 阅读
  9. 谷粒商城学习日志

    2024-04-09 17:34:01       32 阅读
  10. 蓝桥杯刷题 深度优先搜索-[2410]最大连通(C++)

    2024-04-09 17:34:01       34 阅读
  11. ChopticsDriver调用说明

    2024-04-09 17:34:01       36 阅读
  12. [安卓逆向]常见调试和反调试及解决方案

    2024-04-09 17:34:01       37 阅读