• 2.29log | 968.监控二叉树,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯


    968.监控二叉树

    1. class Solution {
    2. public:
    3. int result=0;
    4. int traversal(TreeNode* root,int& result){
    5. if(root==NULL) return 2;
    6. int left=traversal(root->left,result);
    7. int right=traversal(root->right,result);
    8. if(left==2&&right==2) return 0;
    9. else if(left==0||right==0){
    10. result++;
    11. return 1;
    12. }
    13. else return 2;
    14. return -1;
    15. }
    16. int minCameraCover(TreeNode* root) {
    17. if(traversal(root,result)==0) result++;
    18. return result;
    19. }
    20. };

    这道题主要是要知道叶子节点的三种情况,由叶子节点推父节点 ,用0,1,2来标记叶子节点和父节点,0表示没有被覆盖,1表示摄像头,2表示被覆盖,只要叶子节点有一个为0,则父节点为1,result+1,叶子节点均为2,则父节点为0,其余情况父节点均为2,递归完之后如果根节点返回为0,则说明出现了第四种情况,子节点为0且没有父节点,result++

     

    509. 斐波那契数

    1. class Solution {
    2. public:
    3. int fib(int n) {
    4. if(n<=1) return n;
    5. vector<int> dp(n+1);
    6. dp[0]=0;
    7. dp[1]=1;
    8. for(int i=2;i<=n;i++){
    9. dp[i]=dp[i-2]+dp[i-1];
    10. }
    11. return dp.back();
    12. }
    13. };

    dp数组下标含义为F(n)的n,递推公式为F(n)=F(n-1)+F(n-2),dp数组初始化为dp[0]=0,dp[1]=1,遍历顺序为从左到右

    1. class Solution {
    2. public:
    3. int fib(int n) {
    4. if(n<=1) return n;
    5. return fib(n-2)+fib(n-1);
    6. }
    7. };

    这道题用递归来做很简洁,也很巧妙,F(1)和 F(0)在最开始防止数据溢出的条件中

    70. 爬楼梯

    1. class Solution {
    2. public:
    3. int climbStairs(int n) {
    4. if(n<=2) return n;
    5. vector<int> dp(n+1);
    6. dp[1]=1;
    7. dp[2]=2;
    8. for(int i=3;i<=n;i++){
    9. dp[i]=dp[i-1]+dp[i-2];
    10. }
    11. return dp[n];
    12. }
    13. };

    这道题代码和斐波那契数列差不多,首先要找规律得出递推公式,dp[n]下标的含义就是n个台阶,走完n个台阶,最后一步只有两个选择,就是一次踏一步还是一次踏两步,一次踏一步,那么之前一定是走了n-1个台阶,所以有dp[n-1]种方法,同理踏两步,走完n步台阶方法一定是dp[n-2],所以走完n步台阶方法为dp[n-1]+dp[n-2],递推公式为dp[n]=dp[n-1]+dp[n-2];dp数组初始化,根据题目给出条件,只能走一步,两步,所以初始化dp[1]=1,dp[2]=2,遍历顺序为从左到右,后面要根据前面递推

    746. 使用最小花费爬楼梯

    1. class Solution {
    2. public:
    3. int minCostClimbingStairs(vector<int>& cost) {
    4. int n=cost.size();
    5. vector<int> dp(n+1);
    6. dp[0]=0;
    7. dp[1]=0;
    8. for(int i=2;i<=n;i++){
    9. dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
    10. }
    11. return dp[n];
    12. }
    13. };

    这道题的题目描述很奇怪,而且是从台阶0开始跳到台阶cost.size()的,跳到台阶0,1是不需要花费的,所以dp数组起始值dp[0]=0,dp[1]=0,递推公式比斐波那契数列多了花费,递推公式为dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]),遍历顺序还是从左到右

  • 相关阅读:
    Java并发-操作系统,进程,线程,并行并发?
    如何快速本地搭建悟空CRM结合内网穿透工具高效远程办公
    Axure官网下载+使用技巧大揭秘,成为原型设计高手!
    2024.05.14 Diffusion 代码学习笔记
    利用C#实现Pdf转图片
    10 路由协议:西出网关无故人,敢问路在何方
    JVM虚拟机性能监控与故障处理工具(3)
    rpm包管理器常见用法
    湖仓一体电商项目(二):项目使用技术及版本和基础环境准备
    基于JavaSwing开发记事本程序(新功能替换查找撤销状态栏) 课程设计 大作业源码
  • 原文地址:https://blog.csdn.net/weixin_58515995/article/details/136371729