代码随想录算法训练营第三十七天 |738. 单调递增的数字、714. 买卖股票的最佳时机含手续费、968. 监控二叉树

46 阅读1分钟

代码随想录算法训练营第三十七天 |738. 单调递增的数字、714. 买卖股票的最佳时机含手续费、968. 监控二叉树

738. 单调递增的数字

题目链接:738. 单调递增的数字

  • 局部最优:如果前一个数字比后一个数字大,则前一个数字减一,后一个数字变为9。遇到相同的数字的情况,后面的因为已经减一,所以前面的数字也会减一
  • 整体最优:单调递增
  • 注意1000的这种情况,后面的0都要变成9

714. 买卖股票的最佳时机含手续费

题目链接:714. 买卖股票的最佳时机含手续费

  • 贪心代码的原理是,只有真正买入了,才是卖出了

968. 监控二叉树

题目链接:968. 监控二叉树

  •  /**
      * 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) {}
      * };
      */
     ​
      // 1 代表有摄像头
      // 2 代表节点有覆盖
      // 0 代表没有覆盖
     class Solution {
     public:
         int res = 0; 
         int minCameraCover(TreeNode* root) {
             if (traverse(root) == 0) {
                 ++res;
             }
             return res;
         }
         
         int traverse(TreeNode* root) {
             if (root == nullptr) return 2; // 假设空节点有覆盖,因为叶子节点无覆盖
             int left = traverse(root->left);
             int right = traverse(root->right);
             // 如果左孩子和右孩子都有覆盖则不用覆盖
             if(left == 2 && right == 2) {
                 return 0;
             }
             // 如果左孩子或者右孩子有一个没覆盖需要当前节点有摄像头 
             if (left == 0 || right == 0) {
                 ++res;
                 return 1;
             }
     ​
             // 如果左孩子或者右孩子有一台摄像机,就要返回覆盖
             if (left == 1 || right == 1) {
                 return 2;
             }
             return -1;
         }
     };