@ 代码随想录算法训练营第6周(C语言)|Day37(贪心)
Day37、贪心(包含题目 738.单调递增的数字 968.监控二叉树 )
738.单调递增的数字
题目描述
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
题目解答
int monotoneIncreasingDigits(int n) {
int buf[10]={0};
int count=0;
int flag=0;
while(n>0){
buf[count]=n%10;
count++;
n/=10;
}
for(int i=1;i<count;i++){
if(buf[i]>buf[i-1]){
buf[i]--;
flag=i;
}
}
for(int i=flag-1;i>=0;i--){
buf[i]=9;
}
for(int i=count-1;i>=0;i--){
n=n*10+buf[i];
}
return n;
}
题目总结
l先遍历数字将数字变成数组。
968.监控二叉树
题目描述
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
题目解答
int traversal(struct TreeNode*root,int*res){
if(!root){
return 2;
}
int left=traversal(root->left,res);
int right=traversal(root->right,res);
if(left==2&&right==2){
return 0;
}
if(left==0||right==0){
(*res)++;
return 1;
}
if(left==1||right==1){
return 2;
}
return -1;
}
int minCameraCover(struct TreeNode* root) {
int res=0;
if(traversal(root,&res)==0){
res++;
}
return res;
}
题目总结
贪心加递归。