首页 > 其他分享 >(47/60)打家劫舍、打家劫舍Ⅱ、打家劫舍Ⅲ

(47/60)打家劫舍、打家劫舍Ⅱ、打家劫舍Ⅲ

时间:2024-03-21 23:55:31浏览次数:16  
标签:TreeNode nums int 47 60 max 打家劫舍 dp

day47

打家劫舍

leetcode:198. 打家劫舍

动态规划

代码实现

/*
偷到下标为i的最大金额数为dp[i]
偷i、不偷i: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(vector<int>& nums) {
        if(nums.size() == 1) return nums[0];
        vector<int> dp(nums.size(),0);
        dp[0] = nums[0];dp[1] = max(nums[0],nums[1]);
        for(int i = 2;i < nums.size();i++){
            dp[i] = max(dp[i-2] + nums[i],dp[i-1]);
        }
        return dp[nums.size()-1];
    }
};

打家劫舍Ⅱ

leetcode:

动态规划

思路

拆分成两个打家劫舍Ⅰ:考虑头元素、考虑尾元素。

代码实现

/*
偷到下标为i的最大金额数为dp[i]
偷i、不偷i: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(vector<int>& nums) {
        if(nums.size() == 1) return nums[0];
        if(nums.size() == 2) return max(nums[0],nums[1]);
        int result1 = robRange(nums,0,nums.size()-2);
        int result2 = robRange(nums,1,nums.size()-1);
        cout<< result1<<" "<<result2;
        return max(result1,result2);
    }

    int robRange(vector<int>& nums,int begin,int end){
        vector<int> dp(nums.size(),0);
        dp[begin] = nums[begin];
        dp[begin + 1] = max(nums[begin],nums[begin + 1]);
        for(int i = begin + 2;i <= end;i++){
            dp[i] = max(dp[i-2] + nums[i],dp[i-1]);
        }
        return dp[end];
    }
};

打家劫舍Ⅲ

leetcode:337. 打家劫舍 III

动态规划

代码实现

/**
 * 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) {}
 * };
 */
class Solution {
public:
    vector<int> robTree(TreeNode* cur){
        if(!cur) return vector<int>{0,0};
        vector<int> leftdp = robTree(cur->left);
        vector<int> rightdp = robTree(cur->right);
        // dp[0]不偷;dp[1]偷
        int val1 = cur->val + leftdp[0] + rightdp[0];   // 偷
        int val2 = max(leftdp[0],leftdp[1]) + max(rightdp[0],rightdp[1]);   // 不偷

        return vector<int>{val2,val1};
    }

    int rob(TreeNode* root) {
        vector<int> result = robTree(root);
        return max(result[0],result[1]);
    }
};

标签:TreeNode,nums,int,47,60,max,打家劫舍,dp
From: https://www.cnblogs.com/tazdingo/p/18088507

相关文章

  • lc1547 切割棍子的最小成本
    有一根长度为n的木棍,从0到n标记了若干个位置。给定一个数组cuts[m],表示要在cuts[i]位置切开,每次切割的成本是当前木棍的长度,求总成本的最小值。2<=n<=1e6;1<=m<=min(n-1,100);1<=cuts[i]<=n-1;cuts[i]各不相同正向思考的话可以记忆化dfs,也可以逆向思考,转成合并问题,用区间dp求......
  • 科技赋能生活:KTH1601让垃圾桶“懂”你的需求
    在现代社会,科技的快速发展不仅仅改变了我们的生活方式,甚至连日常生活中的垃圾桶也变得“智能”起来。高性能、低功耗霍尔开关传感器KTH1601,正是让智能垃圾桶能够自动感应、自动开关的关键所在。它是由昆泰芯微电子科技有限公司研发的一款全极磁场检测传感器,具备非常低的功耗......
  • MT2492 16V输入 600KHz 2A DCDC同步降压转换器 航天民芯一级代理
    深圳市润泽芯电子有限公司为航天民芯一级代理描述  MT2492是一款完全集成的高效率产品2A同步整流降压变换器。MT2492在一段时间内高效运行宽输出电流负载范围。该设备提供两种工作模式,即PWM控制和PFM模式切换控制在更宽的工作范围内实现高效率加载。MT2492需要最少数量的......
  • 代码随想录算法训练营day29 | leetcode 491. 非递减子序列、46. 全排列、47. 全排列 I
    目录题目链接:491.非递减子序列-中等题目链接:46.全排列-中等题目链接:47.全排列II-中等题目链接:491.非递减子序列-中等题目描述:给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重......
  • 汽车用GMR角度传感器,TLE5014P16DXUMA1、TLE5014S16DXUMA1、TLE5014SP16DE0002XUMA1(360
    TLE5014GMR角度传感器有以下型号可供选择:TLE5014C16:汽车用GMR角度传感器,带SPC接口TLE5014P16:汽车用GMR角度传感器,带PWM接口TLE5014S16:汽车用GMR角度传感器,带SENT接口概述TLE5014基于巨磁阻(GMR)的角度传感器侧重于转向角传感器,设计用于汽车应用的角度位置检测。这些传感......
  • P1960 郁闷的记者
    原题链接题解拓扑排序,层级标记,如果层级等于n,代表层次分明code#include<bits/stdc++.h>usingnamespacestd;vector<int>G[500005];intin[500005]={0};structnode{intid,layer;};intmain(){intn,m;cin>>n>>m;for(inti=1;i<=m;i++)......
  • P1347 排序
    原题链接题解1.\(A<B\)\(\to\)建立一条A向B的边2.由于数据范围小,所以可以输入一次进行一次拓扑遍历3.如果存在矛盾,说明存在环4.对于拓扑排序进行层次标记,如果最大层等于n,代表每个字母层次分明,有先后次序code#include<bits/stdc++.h>usingnamespacestd;vector<int>G[......
  • 分享600套常用的手机网站模板,总有一款适合你
    600套手机网站模板分享:总有一款适合你!演示效果及下载地址:https://www.erdangjiade.com/templates/0-0-108-0-0-01、你先注册好一个帐号,然后私聊找我,我帮你充好积分,2、整站资源就可以直接下载了3、如果有一天,你成为技术大神,你会不会想起,那个曾经指点过你的朋友手机网站已......
  • 考研数学|跟张宇,如何用好《1000题》和《660题》?
    在基础阶段跟随张宇老师的课程学习后,进入强化阶段,究竟是先做1000题还是先做660题?其实没有绝对的答案,因为最佳的选择取决于你自身的掌握程度和学习进度。以下是一些建议,帮助你做出决定。首先,你需要对自己的数学基础进行一个客观的评估。如果你觉得自己的基础已经相当扎实,可以直......
  • 代码随想录算法训练营第十三天|239. 滑动窗口最大值、347.前 K 个高频元素、总结
    题目:239.滑动窗口最大值文章链接:代码随想录视频链接:LeetCode:239.滑动窗口最大值题目链接:力扣题目链接图释:classSolution{public://自己定义一个优先队列classMyQueue{public: deque<int>deq; //弹出 voidpop(intvalue){ //当输入的数组与队顶......