IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【leetcode】打家劫舍专题:337. 打家劫舍 III -> 正文阅读

[数据结构与算法]【leetcode】打家劫舍专题:337. 打家劫舍 III

打家劫舍I

分两种情况

class Solution {
public:
    int rob(vector<int>& a) {
        int n = a.size();
        auto dp  = vector<int>(n+1,0);
        dp[1]=a[0];
        for(int i=2;i<=n;++i){
            dp[i] = std::max<int>( a[i-1] + dp[i-2],dp[i-1] );
        }
        return dp[n];
    }
};

dp开三个大小的就够了

class Solution {
public:
    int rob(vector<int>& a) {
        int n = a.size();
        auto dp  = vector<int>(3,0);
        dp[1]=a[0];
        for(int i=2;i<=n;++i){
            dp[i%3] = std::max<int>( a[i-1] + dp[(i+1)%3],dp[(i+2)%3] );
        }
        return dp[n%3];
    }
};

在这里插入图片描述

打家劫舍III

使用满二叉树的下标方式访问,超时了

第一版想法简单,使用满二叉树
用i*2和i*2+1访问左节点和右节点
dp[i]表示下标为i的子树能取得的最大值
注意更新顺序是从下到上
-----
但是因为把空节点也弄进去了,所以如果输入不友好的时候
就像下面的 一个树 居然像个链表,那这复杂度就受不了了
所以不能存空节点
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

 #define debug(x) cout<<#x<<": "<<(x)<<endl;

class Solution {
public:
    int rob(TreeNode* root) {
        vector<TreeNode*>a = {nullptr};
        queue<TreeNode*>q;
        if( root!=nullptr ){
            q.push(root);
        }

        while( !q.empty() ){

            int n = q.size();
            bool isallnull = true;
            for(int i=0;i<n;++i){
                auto fr = q.front();
                q.pop();
                a.push_back(fr);
                if( fr!=nullptr ){
                    isallnull = false;
                    q.push(fr->left);
                    q.push(fr->right);
                }else{
                    q.push(nullptr);
                    q.push(nullptr);
                }
            }

            if(isallnull){
                break;
            }    
        }

        
        int len = a.size();
        

        vector<int> dp(len,0);

        vector<bool> isin(len,false);

        len/=2;
        // debug(len)

        for(int i=len-1;i>=1;--i){
            if(a[i]!=nullptr){

                int l = i*2;
                int r = i*2+1;

                int chi = 0;

                int ll =  l*2 >=len?0:dp[l*2];
                int lr =  l*2+1 >=len?0:dp[l*2+1];

                int rl =  r*2 >=len?0:dp[r*2];
                int rr =  r*2+1 >=len?0:dp[r*2+1];
                // debug(l)
                // debug(r)

                dp[i] = std::max<int>(dp[l]+dp[r], ll + lr + rl  + rr + a[i]->val);
            }else{
                dp[i] = 0;
            }
        }
        
        return dp[1];
    }
};

在这里插入图片描述
在这里插入图片描述

不存空节点

所以dp数组不能用下标访问了,改成了一个hash_map
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

 #define debug(x) cout<<#x<<": "<<(x)<<endl;

class Solution {
public:
    int rob(TreeNode* root) {
        vector<TreeNode*>a;
        
        a.push_back(nullptr);
        queue<TreeNode*>q;
        if( root!=nullptr ){
            q.push(root);
        }

        while( !q.empty() ){

            int n = q.size();
            bool isallnull = true;

            vector<TreeNode*> t;

            for(int i=0;i<n;++i){

                // cout<<n<<" ";debug(i)
            
                auto fr = q.front();
                q.pop();
                a.push_back(fr);
                if( fr!=nullptr ){
                    isallnull = false;
                    q.push(fr->left);
                    q.push(fr->right);
                }
            }
        }
        
        int len = a.size();
        // debug(len)
        unordered_map<TreeNode*,int> dp;

        vector<bool> isin(len,false);

        for(int i=len-1;i>=1;--i){
            if(a[i]!=nullptr){

                auto l = a[i]->left;
                auto r = a[i]->right;

                int ll =  l==nullptr || l->left==nullptr ?0:dp[l->left];
                int lr =  l==nullptr || l->right == nullptr ?0:dp[l->right];

                int rl =  r==nullptr || r->left == nullptr ?0:dp[r->left];
                int rr =  r==nullptr || r->right == nullptr?0:dp[r->right];


                dp[ a[i] ] = std::max<int>(dp[l]+dp[r], ll + lr + rl  + rr + a[i]->val);
            }
        }
        
        return dp[ a[1] ];
    }
};

在这里插入图片描述

也可以写成递归的


 #define debug(x) cout<<#x<<": "<<(x)<<endl;

class Solution {
public:

    vector<int> dfs(TreeNode* rt){
        if( rt==nullptr){
            return {0,0};
        }
        //{包含rt,不包含rt }
        auto l = dfs(rt->left);
        auto r = dfs(rt->right);
        //cout<<"rt val:"<<rt->val<<": "<<l[1] + r[1] + rt->val<<", "<<l[0]+r[0]<<endl;

        int t = std::max<int>( l[0]+r[0],l[1]+r[1]);
        t = std::max<int>( t,l[0]+r[1]);
        t = std::max<int>( t,l[1]+r[0]);

        return { l[1] + r[1] + rt->val, t };
    }

    int rob(TreeNode* root) {
        auto ret = dfs(root);
        return std::max<int>(ret[0],ret[1]);
    }
};

在这里插入图片描述

感觉效率一般

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:37:25  更:2022-05-12 16:40:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:44:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码