贪心
- 738.单调递增的数字
- 思路:
- 代码
- 968.监控二叉树
- 思路:如何放置,才能让摄像头最小的呢?
738.单调递增的数字
思路:
举例,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299
最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9
代码
class Solution {
public:
int monotoneIncreasingDigits(int N) {
string str = to_string(N);//转换为字符串类型
int flag = str.size();//flag用来标记赋值9从哪里开始,防止第二个for循环再flag没有被赋值的情况下执行
for(int i = str.size() - 1; i > 0; i--) {
if(str[i - 1] > str[i]) {
flag = i;
str[i - 1]--;
}
}
for(int i = flag; i < str.size(); i++) {//对于101,通过上面的循环变为091,通过这个循环变为099
str[i] = '9';
}
return stoi(str);
}
};
代码二:放入数组,是倒叙
class Solution {
public:
int monotoneIncreasingDigits(int n) {
vector<int> count;
if(n < 10)return n;
while(n) {//放入的是倒叙数字
count.push_back(n%10);
n = n/10;
}
int flag = -1;//默认值设置,放置第二个for循环在flag没有被赋值的情况下
for(int i = 1; i < count.size(); i++) {
if( count[i] > count[i -1]) {
count[i]--;
flag = i - 1;
}
}
for(int i = flag ; i >= 0; i--) {
count[i] = 9;
}
//解决101通过上面循环变为 091,再变为099的
int sum = 0;
for(int i = count.size() - 1; i >= 0; i--) {
sum = sum *10 +count[i];
}
return sum;
}
};
968.监控二叉树
思路:如何放置,才能让摄像头最小的呢?
1.摄像头都没有放在叶子节点上:摄像头可以覆盖上中下三层,如果把摄像头放在叶子节点上,就浪费的一层的覆盖。
2.此时,大体思路就是从低到上,先给叶子节点父节点放个摄像头,然后隔两个节点放一个摄像头,直至到二叉树头结点。
3难点:二叉树的遍历用后序遍历
4.状态转移公式,不要和动态规划里面的状态转移公式混淆
5.遍历空节点是那个状态?
- 该节点无覆盖:0
- 本节点有摄像头:1
- 本节点有覆盖:2