Leetcode:打家劫舍系列

news/2024/7/24 7:11:07

文章目录

  • 缘起:
  • 打家劫舍一
  • 打家劫舍二
  • 打家劫舍三


缘起:

闲来无事,上leetcode刷刷题吧!
恰好每日一题,好家伙来了个打家劫舍,题目还有个,这不就是一个系列的吗?
开刷

打家劫舍一

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 400


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/house-robber
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


class Solution {
public:
    int rob(vector<int>& nums) {
        int len = nums.size();
        int ans[105] = {0};

        if(len<=2){
            return len==1? nums[0] : max(nums[0], nums[1]);
        }        
        ans[0] = nums[0]; 
        ans[1] = max(nums[0], nums[1]);
        for(int i=2; i<len; i++){
            ans[i] = max( ans[i-1], ans[i-2]+nums[i]);
        }
        return ans[len-1];
    }
};

打家劫舍二

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
示例 2:

输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 3:

输入:nums = [0]
输出:0

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 1000


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/house-robber-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


class Solution {
public:
    int dp[105] = {-1};
    int data[105] = { 0 };
    int len;
    int rob(vector<int>& nums) {
        len = nums.size();
        if(len==1){
            return nums[0];
        }
        for(int i=0; i<len; i++){
            data[i] = nums[i];
        }

        return max(f(0,len-2), f(1, len-1));
    }
    int f( int start, int end){
       int a = 0;
       int b = 0;
       int ans = 0;
       for(int i=end; i>=start; i--){
           ans = max( a, data[i]+b );
           b = a ;
           a = ans;
       }
       return ans;
    }
    
};

打家劫舍三

  • 递归版本
class Solution {
public:
    int rob(TreeNode* root) {
        if(!root) {
            return 0;
        }
        if(!root->left  && !root->right){
            return root->val;
        }
        
		int a = 0;
        int b = 0;
        int ans = 0;
          // 递归
        // 抢根


        a = root->val ;
        if(root->left != NULL){
            a += rob(root->left->left) + rob(root->left->right);
        }
        if(root->right != NULL){
            a += rob(root->right->left) + rob(root->right->right);
        }
     
        
        // 不抢根
        b = rob(root->left) + rob(root->right);
        ans = max(a,b);
       
        // cout<<root->val<<endl;
        return ans; 

    }
};


  • dp
struct SubtreeStatus{
    int selected;
    int notSelected;
};


class Solution {
public:
    SubtreeStatus dfs(TreeNode* node) {
        if (!node) {
            return {0, 0};
        }
        SubtreeStatus l = dfs(node->left);
        SubtreeStatus r = dfs(node->right);
        int selected = node->val + l.notSelected + r.notSelected;
        int notSelected = max(l.selected, l.notSelected) + max(r.selected, r.notSelected);
        return {selected, notSelected};
    }

    int rob(TreeNode* root) {
        auto rootStatus = dfs(root);
        return max(rootStatus.selected, rootStatus.notSelected);
    }
};


http://www.niftyadmin.cn/n/508517.html

相关文章

DS二叉排序树之创建和插入

文章目录题目实现思路代码题目 给出一个数据序列&#xff0c;建立二叉排序树&#xff0c;并实现插入功能 对二叉排序树进行中序遍历&#xff0c;可以得到有序的数据序列 输入 第一行输入t&#xff0c;表示有t个数据序列 第二行输入n&#xff0c;表示首个序列包含n个数据 第…

问题 D: DS查找—二叉树平衡因子(不一样的新做法哦)

文章目录题目实现思路代码附网上常见的该题做法&#xff0c;比对学习题目 问题 D: DS查找—二叉树平衡因子 题目描述 二叉树用数组存储&#xff0c;将二叉树的结点数据依次自上而下,自左至右存储到数组中&#xff0c;一般二叉树与完全二叉树对比&#xff0c;比完全二叉树缺少的…

base64笔记

文章目录1、[WIKI的解释](https://zh.wikipedia.org/wiki/Base64)2、太深奥了&#xff0c;翻译一下3、发现了个问题4、附沅大的解释5、base64转换工具1、WIKI的解释 Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于 log 2 ⁡64 6 &#xff0c;所以每6个比特…

react踩坑

文章目录1. 默认路由在V5被废除1.1. Attempted import error: IndexRoute is not exported from react-router-dom.1.2. tiny-warning.esm.js:11 Warning: You should not use and in the same route; will be ignored2、组件问题2.1. Warning: The tag is unrecognized in thi…

js的常见错误

文章目录1. 在初始化之前不能访问xx1. 在初始化之前不能访问’xx’ 报错信息&#xff1a; Uncaught ReferenceError: Cannot access btn before initialization 报错代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

js更改网页默认右键菜单

文章目录1. 基础2. 实现思路3. 测试代码4. 结果1. 基础 推荐博客 2. 实现思路 使用ul配合li写出你想要自定义的菜单&#xff0c;并给每个li绑定处理事件写自定义菜单的样式隐藏ul对document.oncontextmenu 绑定函数&#xff0c;阻止默认行为显示自定义菜单菜单被点击完之后&…

微信小程序表单获取神器

文章目录学习原因&#xff1a;学习内容&#xff1a;学习产出&#xff1a;学习原因&#xff1a; 在小程序开发中&#xff0c;我们常常会遇到这样的输入框 在常规情况下&#xff0c;我们会想着给输入框绑定一个失去焦点触发的事件去获取我们输入的内容&#xff0c;比如下面这一…

react悬案,组件间通信巨坑

文章目录1. 父组件2. 子组件3. 期望结果4. 实际结果5.原因分析6. 解决办法7. 最后的代码事情的起因是这样的&#xff0c; 在一个小业务中&#xff0c;需要使用到react开发&#xff0c;希望子组件通过父组件控制是否渲染&#xff0c;本来是一个很简单的业务&#xff0c;但是在实…