当前位置:   article > 正文

代码随想录训练营Day36:Leetcode738、968

代码随想录训练营Day36:Leetcode738、968

Leetcode738:

问题描述:

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

示例 1:

输入: n = 10
输出: 9

示例 2:

输入: n = 1234
输出: 1234

示例 3:

输入: n = 332
输出: 299

代码及注释解析:

  1. class Solution {
  2. public:
  3. int monotoneIncreasingDigits(int n) {
  4. //个位数直接返回
  5. if(n<10)return n;
  6. //最多十位数
  7. int arr[10];
  8. //拆分每一位存储,便于贪心
  9. int i=0;
  10. while(n>0){
  11. arr[i++]=n%10;
  12. n=n/10;
  13. }
  14. if(isKey(arr,i)){
  15. return f(arr,i);
  16. }
  17. //开始贪心,该数组必须变成最大的非递减数组
  18. for(int j=0;j<i-1;j++){
  19. //找到从低位开始的第一个逆序对,因为要尽力少减点的
  20. if(arr[j]<arr[j+1]){
  21. arr[j+1]-=1;
  22. //拉满低位能满足要求的最大
  23. for(int p=0;p<=j;p++){
  24. arr[p]=9;
  25. }
  26. if(isKey(arr,i)){
  27. return f(arr,i);
  28. }
  29. }
  30. }
  31. return f(arr,i);
  32. }
  33. //是否是满足题目要求的数组
  34. bool isKey(int* arr,int n){
  35. for(int i=0;i<n-1;i++){
  36. if(arr[i]<arr[i+1])return false;
  37. }
  38. return true;
  39. }
  40. //数组转整型
  41. int f(int*arr,int n){
  42. int sum=0;
  43. for(int i=n-1;i>=0;i--){
  44. sum=sum*10+arr[i];
  45. }
  46. return sum;
  47. }
  48. };

Leetcode968:

问题描述:

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

代码及注释解析:

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. int result=0;
  15. int minCameraCover(TreeNode* root) {
  16. //开始装摄像头!!!
  17. if(dfs(root)==0){
  18. result+=1;
  19. }
  20. return result;
  21. }
  22. int dfs(TreeNode* root){
  23. //空节点都是覆盖
  24. if(!root)return 2;
  25. //递归到左右子树放置摄像头
  26. int left=dfs(root->left);
  27. int right=dfs(root->right);
  28. //如果左右子孩子都被覆盖,当前父节点不需要被覆盖
  29. if(left==2&&right==2){
  30. return 0;
  31. }
  32. //左右子树有一个没被覆盖,父节点都必须放置摄像头
  33. if(left==0||right==0){
  34. result+=1;
  35. return 1;
  36. }
  37. //左右子孩子有一个放了摄像头,父节点被覆盖
  38. if(left==1||right==1)return 2;
  39. return -1;
  40. }
  41. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/680410
推荐阅读
相关标签
  

闽ICP备14008679号