码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 代碼隨想錄算法訓練營|第三十九天|738.单调递增的数字、968.监控二叉树、第八章 贪心算法總結。刷题心得(c++)


    目录

    讀題

    738.单调递增的数字

    自己看到题目的第一想法

    看完代码随想录之后的想法

    968.监控二叉树

    自己看到题目的第一想法

    看完代码随想录之后的想法

    738.单调递增的数字 - 實作

    思路

    Code

    968.监控二叉树  - 實作

    思路

    Code

    贪心算法 總結

    贪心理论基础

    貪心很簡單,只是常識嗎

    貪心算法有沒有套路

    怎麼辨認出貪心算法

    貪心題目

    贪心简单题

    贪心中等题

    贪心难题

    總結

    自己实现过程中遇到哪些困难

    今日收获,记录一下自己的学习时长

    相關資料

    第八章 贪心算法 part06


    讀題

    738.单调递增的数字

    自己看到题目的第一想法

    我在思考局部最優可能就是由後往前遍歷,倆倆比較假設後大於前,則不用變,前大於後,那就減掉前面的值,遍歷全部的數,但實際要怎麼解,帶馬上沒有想法。

    看完代码随想录之后的想法

    看完之後發現跟我的想法相同,但更直接一點是把後面的數都變為9,很直接但很符合貪心的想法,基本上這樣做就不用擔心是否為單調遞增,並且取最大的單調遞增數並且透過flag紀錄i在哪裡開始要全部變成9,整體透過兩個不嵌套的迴圈解決這個問題。

    另外轉成string也很棒,就是讓我們可以更直覺地去操控數字,因為如果沒有的話可能要花更多的代碼量去處理最後的結果。

    968.监控二叉树

    自己看到题目的第一想法

    在思考是不是貪心算法是找到葉子節點的父節點,並且之後都往跳兩層的父節點,這樣就可以找到全部了,但因為牽涉到二叉樹,並不是那麼了解到底怎麼處理。

    看完代码随想录之后的想法

    貪心思路,後序遍歷,狀態劃分,四種情況

    左右都有覆蓋

    左右至少有一個無覆蓋

    左右至少有一個有攝像頭

    最後遍歷根節點無覆蓋,加攝像頭

    看完之後覺得這題我只思考到貪心算法,但是後序遍歷,這個我需要去複習,狀態劃分以及四種情況我沒有思考到,但題目是有趣的,讓我對二叉樹以及貪心算法有個好玩的結合。

    738.单调递增的数字 - 實作

    思路

    1. n轉為string -> 方便處理數字變化
    2. flag記錄從哪裡開始變為九
    3. 假設前一個數大於當前的數,紀錄flag並且將number[i - 1] -- (因為在string當中,--可以直接將數字往下掉一個數,並且可以想像這個數就是要減掉,當前的位數才能為9)
    4. 將flag往後的數全部改為9
    5. return stoi(number);

    Code

    1. class Solution {
    2. public:
    3. int monotoneIncreasingDigits(int n) {
    4. string number = to_string(n);
    5. int flag = number.size();
    6. for(int i = number.size() - 1; i > 0; i--) {
    7. if(number[i - 1] > number[i]) {
    8. flag = i;
    9. number[i - 1]--;
    10. }
    11. }
    12. for(int i = flag; i < number.size(); i++){
    13. number[i] = '9';
    14. }
    15. return stoi(number);
    16. }
    17. };

    968.监控二叉树  - 實作

    思路

    1. 定義三個狀態: 有覆蓋、無覆蓋、有攝像頭
    2. 二叉樹的四種可能性
      1. 左右都有覆蓋
      2. 左右至少有一個無覆蓋
      3. 左右至少有一個有攝像頭
      4. 根節點無覆蓋,加攝像頭
    3. 定義一個result紀錄結果
    4. 定義一個函數遍歷二叉樹
      1. 假設遍歷到null,需要回傳覆蓋,那在葉子節點的父節點才會加上一個攝像頭
      2. 左右遍歷
      3. 中節點處理三種可能性
    5. 主函數
      1. result初始化
      2. 遍歷節點,假設回傳為0 則代表最後一種狀態result++
      3. 回傳result.

    Code

    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 traveral(TreeNode* cur) {
    16. if(cur == NULL) return 2; // 假設在葉子節點,需要選擇有覆蓋,那在葉子節點的父節點才會加上一個攝像頭
    17. int left = traveral(cur->left);
    18. int right = traveral(cur->right);
    19. if(left == 2 && right == 2) return 0; //左右都有覆蓋
    20. if(left == 0 || right == 0) { //左右至少有一個無覆蓋,則一定要一個攝像頭
    21. result++;
    22. return 1;
    23. }
    24. if(left == 1 || right == 1) return 2; // 左右至少有一個攝像頭,則return 2,因為代表該節點有被覆蓋到
    25. return -1;
    26. }
    27. int minCameraCover(TreeNode* root) {
    28. result = 0;
    29. if(traveral(root) == 0) { //最後一種情況,假設根節點左右節點都有覆蓋,那則要多加一個攝像頭
    30. result++;
    31. }
    32. return result;
    33. }
    34. };

    贪心算法 總結

    贪心理论基础

    回顧貪心算法,真的沒有固定的解法,可能有類似的套路,比如說重疊區間,或者是子序和,但整體還是一個思路上的轉換

    貪心很簡單,只是常識嗎

    貪心算法很簡單,主要體現在代碼上,但難點主要是思路上的轉換,說簡單也不簡單

    貪心算法有沒有套路

    沒有套路!沒有套路!沒有套路

    真的是要讓自己的視野打開,多寫多練習,讓自己的腦袋瘋狂運轉,會越來越好的

    怎麼辨認出貪心算法

    其實任何情況下只要能推導出局部最優在堆疊到全局最優的題目都可以是貪心算法,但有些問題當然可以套用其他的解題技巧幫忙,貪心算法我認為就像是心法,它沒有招式但所以我們只能意會,很奇妙的章節。

    貪心題目

    題目分級,來源至代碼隨想錄

    贪心简单题

    • 贪心算法:分发饼干
    • 贪心算法:K次取反后最大化的数组和
    • 贪心算法:柠檬水找零

    贪心中等题

    • 贪心算法:摆动序列
    • 贪心算法:单调递增的数字
    • 股票系列问题
      • 贪心算法:买卖股票的最佳时机II
      • 贪心算法:买卖股票的最佳时机含手续费
    • 两个维度权衡问题
      • 贪心算法:分发糖果
      • 贪心算法:根据身高重建队列

    贪心难题

    这里的题目如果没有接触过,其实是很难想到的,甚至接触过,也一时想不出来,所以题目不要做一遍,要多练!

    • 贪心解决区间问题
      • 贪心算法:跳跃游戏
      • 贪心算法:跳跃游戏II
      • 贪心算法:用最少数量的箭引爆气球
      • 贪心算法:无重叠区间
      • 贪心算法:划分字母区间
      • 贪心算法:合并区间
    • 其他难题
      • 贪心算法:最大子序和
      • 贪心算法:加油站
      • 贪心算法:我要监控二叉树!

    總結

    自己实现过程中遇到哪些困难

    今天的難點主要在監控二叉樹,單調遞增的數字難點主要在代碼,監控二叉樹則是需要考慮到多個面向的狀態,但其實真的很好玩,理解之後,寫代碼其實反而就是之前二叉樹章節的基礎,主要是思路不好想。

    今日收获,记录一下自己的学习时长

    整體花大概兩個小時,貪心算法真的很奇妙,但理解之後真的很開心,感覺非常好玩。

    相關資料

    ● 今日学习的文章链接和视频链接

    第八章 贪心算法 part06

    738.单调递增的数字

    https://programmercarl.com/0738.单调递增的数字.html

    968.监控二叉树

    https://programmercarl.com/0968.监控二叉树.html

    总结

    https://programmercarl.com/贪心算法总结篇.html

  • 相关阅读:
    Flink学习第八天——Flink核心的Sink Operator实战
    【漏洞复现】typecho_v1.0-14.10.10_unserialize
    基于单片机的机械臂运行轨迹在线控制系统设计
    算法之跳表
    零代码极限封装的【接口自动化测试框架】震碎你的三观
    【Android 屏幕适配】屏幕适配通用解决方案 ② ( 自定义组件解决方案 | 需要解决的问题 : 设计稿坐标数据转为屏幕真实坐标数据 | 实现步骤 )
    Golang import
    开水果店需要知识有哪些,开水果店需要的水果资料有哪些
    【mybatis基础(二)】实现对数据库的CRUD
    Global AI Bootcamp 成都站 圆满结束!
  • 原文地址:https://blog.csdn.net/RVLIN/article/details/133849575
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号