代碼隨想錄算法訓練營|第三十九天|738.单调递增的数字、968.监控二叉树、第八章 贪心算法總結。刷题心得(c++)

本文主要是介绍代碼隨想錄算法訓練營|第三十九天|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

class Solution {
public:int monotoneIncreasingDigits(int n) {string number = to_string(n);int flag = number.size();for(int i = number.size() - 1; i > 0; i--) {if(number[i - 1] > number[i]) {flag = i;number[i - 1]--;}}for(int i = flag; i < number.size(); i++){number[i] = '9';}return stoi(number);}
};

968.监控二叉树  - 實作

思路

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

Code

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int result = 0;int traveral(TreeNode* cur) {if(cur == NULL) return 2; // 假設在葉子節點,需要選擇有覆蓋,那在葉子節點的父節點才會加上一個攝像頭int left = traveral(cur->left);int right = traveral(cur->right);if(left == 2 && right == 2) return 0; //左右都有覆蓋if(left == 0 || right == 0) { //左右至少有一個無覆蓋,則一定要一個攝像頭result++;return 1;}if(left == 1 || right == 1) return 2; // 左右至少有一個攝像頭,則return 2,因為代表該節點有被覆蓋到return -1;}int minCameraCover(TreeNode* root) {result = 0;if(traveral(root) == 0) { //最後一種情況,假設根節點左右節點都有覆蓋,那則要多加一個攝像頭result++;}return result;}
};

贪心算法 總結

贪心理论基础

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

貪心很簡單,只是常識嗎

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

貪心算法有沒有套路

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

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

怎麼辨認出貪心算法

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

貪心題目

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

贪心简单题

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

贪心中等题

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

贪心难题

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

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

總結

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

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

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

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

相關資料

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

第八章 贪心算法 part06

738.单调递增的数字

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

968.监控二叉树

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

总结

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

这篇关于代碼隨想錄算法訓練營|第三十九天|738.单调递增的数字、968.监控二叉树、第八章 贪心算法總結。刷题心得(c++)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237801

相关文章

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS