目录
LeeCode 738.单调递增的数字
LeeCode 968.监控二叉树
LeeCode 738.单调递增的数字
思路:从后向前遍历,遇到strNum[i - 1] > strNum[i]的情况,则strNum[i - 1]--;,重复利用上次比较的结果进行比较,直至得出最终答案。
时间复杂度:O(n) 空间复杂度:O(n)
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string strNum = to_string(n);
int flag = strNum.size();
for (int i = strNum.size() - 1; i > 0; i--) {
if (strNum[i - 1] > strNum[i]) {
flag = i;
strNum[i - 1]--;
}
}
for (int i = flag; i < strNum.size(); i++) {
strNum[i] = '9';
}
return stoi(strNum);
}
};
LeeCode 968.监控二叉树
思路:使用后序遍历从下往上每隔两个节点放一个摄像头。
局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量最少。
状态转移:0:该节点无覆盖; 1:本节点有摄像头; 2:本节点有覆盖。
时间复杂度:O(n) 空间复杂度:O(n)
class Solution {
private:
int result;
int traversal(TreeNode* cur) {
if (cur == NULL) return 2;
int left = traversal(cur->left);
int right = traversal(cur->right);
if (left == 2 && right == 2) return 0;
if (left == 0 || right == 0) {
result++;
return 1;
}
if (left == 1 || right == 1) return 2;
return -1;
}
public:
int minCameraCover(TreeNode* root) {
result = 0;
if (traversal(root) == 0) result++;
return result;
}
};