从右往左遍历,若左边数字大于当前数字,则应将当前数字替换成9,左边数字减1
n = 100时
00时,不会修改;10 时会修改成 09,此时9大于了右边的0
所以应当记录最后一次修改的位置,将该位置之后的数字全部改为9
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string str = to_string(n);
int k = str.size();
for (int i = str.size() - 1; i > 0; i--) {
if (str[i] < str[i - 1]) {
k = i;
str[i - 1]--;
}
}
for (int i = k; k < str.size(); k++) {
str[k] = '9';
}
return stoi(str);
}
};
class Solution {
public:
int ans;
// 0 表示无覆盖 1 表示有摄像头 2 表示被覆盖,没有摄像头
int dfs(TreeNode* node)
{
if (node == nullptr) return 2;
int left = dfs(node->left);
int right = dfs(node->right);
if (left == 2 & right == 2) return 0; // 贪心,左右都被覆盖了,本节点不需要摄像头
if (left == 0 || right == 0)
{
ans++;
return 1;
}
if (left == 1 || right == 1)
{
return 2;
}
return -1;
}
int minCameraCover(TreeNode* root) {
ans = 0;
if (dfs(root) == 0) ans++;
return ans;
}
};