【算法练习Day31】单调递增的数字买卖股票的最佳时机含手续费监控二叉树

news2024/9/20 0:53:25

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 单调递增的数字
  • 买卖股票的最佳时机含手续费
  • 监控二叉树
  • 总结:

单调递增的数字

738. 单调递增的数字 - 力扣(LeetCode)

题目描述,就是找出比给定整数小的一个最大整数,且该整数满足最高位到最低位依次递增(可以出现相等数字)。找到的最大递增数字也可以和给定数字相等,只要满足单调递增就可以了。

题目乍一看没什么理解上的难度,但是真的要分析出来,确实有些难度,并不是思路有很难,而是很难想出来。要做出来题,主要是要想清一点,给定一个数是如何求到最大的单调递增,例如给的数是98求出来的数是89,89满足小于等于98的且单调递增,而且你找不出任何比89更大的单调递增,那么它一定是符合的,322得到的是299,这两个示例看似没有共同点,实际上是暗藏玄机的。都是将一个数的最高位减一,然后其余位数变成9,就能得到了,那可有反例呢?1234就是反例,它求出的应该是1234也就是数字本身,这时我们就要加一个限制条件,先判断数字,再变化各位不要无脑变化。

具体思路是:比较各个数位,相邻数位中是否出现第一个数比第二个数大,如果出现了那说明符合之前的规律,如果如相反,则说明给出的数在目前这两位是1234这种类型的,往后遍历再试试。那问题来了,是从前向后遍历还是从后向前遍历呢?答案应该是从后向前依次遍历,如果是从前向后的话遇到了当前数据比上一位数小的情况则上一位数要减小1,那如果减小1了之后它又比之前位数小了这怎么办呢?这就出现bug了,所以不要从前向后遍历,这样会改变之前的数据,应该从后向前遍历,改变的是下一个数的值,这样就不会改变之前遍历过的数了。

具体见代码

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

看了代码后发现,其实我们所要注意的不止这些,还有flag做标记,它的作用是标记从哪一位数之后的数应该全部变为9,这一点也是相当重要的,这样的思路我们可以在全部的数位遍历完之后再去修改要改成9的位,方便了我们的操作。在操作给定数之前由于是int类型的,操作起来会有一些不方便,所以我们将其变为字符串类型,这样可以方便我们对该数进行数位上的操作。

买卖股票的最佳时机含手续费

714. 买卖股票的最佳时机含手续费

思路:贪心算法

  1. 由于本题有手续费,所以可能会出现买卖利润不足以覆盖手续费的情况;

  2. 贪心策略:最低值买入,最高值(算上手续费还有盈余)卖出;寻找买入日和卖出日;买入日:遇到价格更低点就记录;卖出日:只要当前价格大于(最低价格+手续费),就可以收获利润,准确的卖出日为连续收获利润区间的最后一天。

  3. 情况一:今天可以收获利润,但不是收获利润区间里的最后一天,持有股票。情况二:前一天是收获利润区间的最后一天(即已经卖出),今天重新记录最小价格。情况三:不操作,保持原有状态(买入,卖出,不买不卖)。

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int sum = 0;
        int buy = prices[0]+fee;//记录最低价格
        for(int p:prices){
            if(p+fee<buy){//情况二:重新买入
                buy=p+fee;
            }else if(p>buy){//情况一:可获利
                sum+=p-buy;
                buy=p;//还在收获利润的区间里,并非真正的卖出,不需要考虑fee
            }
        }
        return sum;
    }
};

监控二叉树

968.监控二叉树

思路:

  1. 摄像头可以覆盖上中下三层;把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖面积。局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少。

  2. 【遍历顺序】从下往上,因此使用后序遍历;

  3. 【隔两个节点放一个摄像头】0表示该节点无覆盖,1表示本节点有摄像头,2表示本节点有覆盖;其中,空节点的状态只能是有覆盖。

  4. 【递归终止条件】遇到空结点,返回2;

  5. 【单层逻辑处理】情况1:左右节点都有覆盖(2),那么中间节点无覆盖(0);情况2:左右节点至少有一个无覆盖(0),那么中间节点放摄像头(1);情况3:左右节点至少有一个摄像头(1),那么中间节点有覆盖(2);情况4:递归完后若头节点没有覆盖,result++;

class Solution {
private:
    int result;
    int traversal(TreeNode* cur) {
        if (cur == NULL) return 2;
        int left = traversal(cur->left);    // 左
        int right = traversal(cur->right);  // 右
        if (left == 2 && right == 2) return 0;
        else if (left == 0 || right == 0) {
            result++;
            return 1;
        } else return 2;
    }
public:
    int minCameraCover(TreeNode* root) {
        result = 0;
        if (traversal(root) == 0) { // root 无覆盖
            result++;
        }
        return result;
    }
};

总结:

今天我们完成了单调递增的数字、买卖股票的最佳时机含手续费、监控二叉树三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【爬虫】python打包可执行程序(ui界面制作完成后)

1.安装pyinstaller pip install pyinstaller可能出现连接超时安装不上的情况,可以切换源进行下载 pip install -i http://pypi.douban.com/simple/ pyinstaller2.打包程序 pyinstaller xxxxx.py --noconsole --hidden-import PySide6.QtXml

锐捷云课堂主机 默认口令 目录遍历漏洞

输入默认账号密码admin/admin,成功登录 构造payload&#xff0c;并访问&#xff1a; /pool/目录遍历漏洞&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用此文所提供的信息、技术或方法…

电子器件 电容的参数、选型与使用技巧

一、参数 最重要的参数有五个&#xff0c;分别是精度、温度系数、耐压、温度范围和ESR。 1.1 精度 电容和电阻不同&#xff0c;电阻精度可以做到高于 0.1%&#xff0c;而电容的话 5% 精度非常高的了。一般为 5%&#xff0c;10%&#xff0c;25% 等。 1.2 温度系数 电容的电…

Graalvm-21 Windows初体验

前言 除了最新新出的jdk21以外&#xff0c;oracle还推出了重磅的graalvm-jdk-21。这个graalvm可以把java代码编译为本地执行文件&#xff0c;就是把原来的jar包直接打成exe。并且使用打完的exe占用的内存资源更小&#xff0c;启动速度更快&#xff0c;非常适合云平台部署&#…

仓库管理系统源代码集合,带图片展示和网站演示

目录 1、ModernWMS2、GreaterWMS3、kopSoftWMS4、SwebWMS5、若依wms6、jeewms 1、ModernWMS 体验地址&#xff1a;https://wmsonline.ikeyly.com 简易完整的仓库管理系统 该库存管理系统是&#xff0c;我们从多年ERP系统研发中总结出来的一套针对小型物流仓储供应链流程。 简…

crs 维护模式 exclusive mode

How To Validate ASM Instances And Diskgroups On A RAC Cluster (When CRS Does Not Start). (Doc ID 1609127.1)​编辑To Bottom [rootrac1 ~]# ps -ef|grep grid root 2477 1 1 20:47 ? 00:00:51 /opt/oracle.ahf/jre/bin/java -server -Xms32m -Xmx64…

JavaScript控制流程简介

目录 条件语句 if语句 else if语句 else语句 循环语句 for循环 while循环 do...while循环 switch语句 总结 在编程中&#xff0c;控制流程是指程序执行的顺序&#xff0c;即代码按照何种方式被执行。JavaScript作为一种强大的脚本语言&#xff0c;具备了灵活的控制流…

VScode 调试 linux内核

VScode 调试 linux内核 这里调试的 linux 内核是通过 LinuxSD卡(rootfs)运行的内核 gdb 命令行调试 编辑 /home/tyustli/.gdbinit 文件&#xff0c;参考 【GDB】 .gdbinit 文件 set auto-load safe-path /home/tyustli/code/open_source/kernel/linux-6.5.7/.gdbinit在 lin…

uniapp的一些总结

目录 前言 解决方案 1. 跨平台开发 2. Vue.js生态 3. 组件库 4. 自定义组件 5. Native能力 6. 插件生态 7. 性能优化 写法 1. 模板&#xff08;Template&#xff09; 2. JavaScript 3. 样式&#xff08;Style&#xff09; 代码 高质量 结论 事件 API 1. 获取…

二叉树:有了如此高效的散列表,为什么还需要二叉树?

文章来源于极客时间前google工程师−王争专栏。 上一节我们学习了树、二叉树以及二叉树的遍历&#xff0c;今天我们再来学习一种特殊的的二叉树&#xff0c;二叉查找树。二叉查找树最大的特点就是&#xff0c;支持动态数据集合的快速插入、删除、查找操作。 我们之前说过&…

MODBUS-RTU从站通信(SMART PLC作为MODBUS-RTU从站)

SMART PLC作为MODBUS-RTU主站通信请参考下面文章链接: 【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客文章浏览阅读2.5k次,点赞5次,收藏10次。MODBUS通讯非常简单、应用也非常广泛,有些老生常谈的问题,这里不再赘述,感兴趣的可以参看…

【394.字符串解码】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:string decodeString(string s) {stack<string> s1;s1.push("");stack<int> s2;int i 0, n s.size();while (i < n){//1.如果是数字入…

听GPT 讲Rust源代码--library/std(6)

题图来自 Why you should use Python and Rust together[1] File: rust/library/std/src/sys/unix/thread_parking/netbsd.rs 文件netbsd.rs位于Rust源代码的rust/library/std/src/sys/unix/thread_parking目录下。该文件是Rust标准库中用于Unix操作系统的线程等待和唤醒机制的…

如何做好一次代码审查,什么样是一次优秀的代码审查,静态代码分析工具有哪些

代码审查是确保代码质量、提升团队协作效率、分享知识和技能的重要过程。以下是进行优秀代码审查的一些指南&#xff1a; 如何做好代码审查&#xff1a; 理解代码的背景和目的&#xff1a; 在开始审查前&#xff0c;确保你了解这次提交的背景和目的&#xff0c;这有助于更准确…

pycharm运行R语言脚本(win10环境下安装)

文章目录 简介1. pycharm安装插件2. 安装R语言解释器2.1下载安装包2.2具体安装过程 3.编辑环境变量4 检验是否安装成功&#xff1a;5.安装需要的library6.pycharm中配置安装好的R语言解释器 简介 pycharm 安装 R language for Intellij R language for Intellij 是一个插件&am…

SolidWorks2020详细步骤安装教程

SolidWorks 2020 提供了许多增强和改进功能&#xff0c;其中大多数是直接针对客户要求而做出的增强和改进,这些增强功能可以帮助您加速和改进产品开发流程。从概念设计到制造产品&#xff0c;设计、模拟、制造和协作方面的改进让您可以使用新的工作流程来缩短上市时间和提高产品…

雨云OSS服务介绍和使用教程,以及Chevereto图床使用雨云OSS的教程

雨云OSS&#xff08;对象存储&#xff09;服务介绍和使用教程&#xff0c;以及Chevereto图床程序使用雨云OSS的教程 雨云OSS&#xff08;对象存储&#xff09;是一种基于S3协议的云端数据存储服务&#xff0c;它可以帮助你将数据安全、高效地存储在云端&#xff0c;并且可以随…

vue使用WEB自带TTS实现语音文字互转

前言 时隔多日&#xff0c;自己已经好久没更新文章了&#xff1b;今年一直跟随公司的政策[BEI YA ZHA]中&#xff0c;做了一个又一个的需求&#xff0c;反而没有多少自己的时间&#xff0c;更别说突破自己 ˚‧(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧˚&#xff08;雾&#xff09; 然…

JavaScript_Pig Game切换当前玩家

const current0El document.getElementById(current--0); const current1El document.getElementById(current--1); if (dice ! 1) {currentScore dice;current0El.textContent currentScore;} else {} });这是我们上个文章写的代码&#xff0c;这个代码明显是有问题的&…

图解Kafka高性能之谜(五)

高性能网络模型NIO 简单架构设计&#xff1a; 详细架构设计&#xff1a; 高性能的磁盘写技术 高性能的消息查找设计 索引文件定位使用跳表的设计 偏移量定位消息时使用稀疏索引&#xff1a; 高响应的磁盘拷贝技术 批处理设计 请求亲和性设计 内存池高效、安全设计 高性能…