代码随想录算法训练营第三十七天 |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; } };