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

(中等)

题目

描述
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例1
输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
输出:8
解释:能够达到的最大利润:
在此处买入 prices[0] = 1
在此处卖出 prices[3] = 8
在此处买入 prices[4] = 4
在此处卖出 prices[5] = 9
总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

示例 2:
输入:prices = [1,3,7,5,10,3], fee = 3
输出:6

思路

此题与 LeetCode 122 买卖股票的最佳时机 II 题目相似,但是本题多了手续费这个额外条件,因此又提升了一个难度层次(我们无法再只是简单得求数组的两位之差并返回正数和来算出正确结果,具体可参考之前文章:LeetCode 122:买卖股票的最佳时机 II)。

本题的思路如果笼统地讲的话其实十分清晰,就是在股票价格极小值的时候买入,价格极大值的时候卖出,但是,如何判断什么时候是极小值与极大值呢?因为价格极小值一定在价格数组中,并且可能有多个,因此我们先令极小值 minPrice 的初值为 prices[0],每次遍历时,如果当前价格小于 minPrice,那么说明此价格更小,更可能是极小值,应让 minPrice 等于此值;如果当前价格高于 minPrice 和 手续费之和,那么说明此时是处于收益状态的,但可能并未到达价格的最高值,因此不能确定是否卖出,但是完全可以将此次产生的当天利润给加到结果变量 profit 中,即执行 profit += prices[i] - minPrice - fee,由于明天可能还要盈利,因此不一定是真正的卖出,而为了避免计算利润每次都要减去手续费,并且要更新极小值 minPrice ,所以让 minPrice = prices[i] - fee,这样在明天收获利润的时候,才不会多减一次手续费。

实现

public class TX17买卖股票的最佳时机含手续费 {public int maxProfit(int[] prices, int fee) {if (prices == null || prices.length == 0 || fee < 0) {return 0;}int profit = 0;int minPrice = prices[0];for (int i = 1; i < prices.length; i++) {//价格低-->买入if (prices[i] < minPrice) {minPrice = prices[i];}//价格高-->持续收益,最后卖出if (prices[i] > minPrice + fee) {profit += prices[i] - minPrice - fee;minPrice = prices[i] - fee;}}return profit;}public static void main(String[] args) {TX17买卖股票的最佳时机含手续费 s = new TX17买卖股票的最佳时机含手续费();System.out.println("s.maxProfit(new int[]{1, 3, 2, 8, 4, 9}, 2) = " + s.maxProfit(new int[]{1, 3, 2, 8, 4, 9}, 2));}
}


LeetCode 968 监控二叉树

(困难)

题目

描述
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。

示例

思路

本题可以用贪心算法解决,其中的贪心思想是从最下层叶子结点的父结点开始安置摄像头,这样就能尽可能多得覆盖结点,从而使得最终使用摄像头的数量最少

明白了本题的贪心思想后,还有一个问题需要解决,那就是如何在遍历树的时候,能够知道此结点,或是此结点的左右子结点有摄像头或是没有摄像头从而进行合适的操作与判断呢?要解决这个问题,我们可以假设树中结点有三种状态,分别对应数字 0,1,2,对应含义为 0—没被监视覆盖,1—有摄像头,2—被监视覆盖(可能您会有疑问:有1—摄像头和2—被监视覆盖不是一种情况吗,确实,从状态上说,他们都是被监视状态,但是,有摄像头是一种特殊情况,它直接影响一个结点的父结点、子结点的状态情况,因此需要单独拿出来,而与之对应的,还有一种无摄像头的情况,这种情况由于是属于0—没被监视覆盖,而且我们不需要单独处理这种情况,因此,便不再单独考虑这种无摄像头的,而是直接用没被监视覆盖来概括,当然,如果您是用逆向思维的话,那么也可以反过来想啦)。

还有一个问题需要解决,因为核心算法中避免不了深度遍历与其中的递归结果记录,那就是由于在遍历中如果遇到空结点怎么办,要返回什么,其实可以将空结点单独归为一种状态,但是那样会多出很多额外的判断语句与特殊情况,其实我们可以这样想,空结点可以假设为2—被监视覆盖,这样不会影响到叶子结点的状态,也不会对最终产生任何影响,因为一个结点是2—被监视覆盖的话,那么其实可以不用额外考虑为了它而加摄像头的,因为它已经被覆盖了

接下来,就可以正式考虑摄像头加不加的各种情况了,总共有 3 种基本情况,2 种特殊情况(再次声明,是从下向上来进行加摄像头的判断):

  • 情况1:若一个结点的左右子结点都有覆盖,那么便可以在此结点的上层父结点来安置摄像头,而此层不用安装,返回 0;

  • 情况2:只要左右子结点有一个没被覆盖,由于是从下向上覆盖,那么此结点理所应当就要安置摄像头,返回 1;

  • 情况3:如果左右子结点有一个安了摄像头,那么此结点必然能被覆盖,返回 2;

  • 特殊情况1:当前为空结点,返回 2(上面已经说明过为什么是 2,不再赘述);

  • 特殊情况2:若root没被覆盖,要单独给root安一个摄像头。

实现

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}public class TX18监控二叉树 {//状态:0没被监视覆盖,1:有摄像头,2:被监视覆盖int result = 0;private int traverse(TreeNode cur) {if (cur == null) { //空结点假设是被监视状态return 2;}int left = traverse(cur.left);int right = traverse(cur.right);//情况1:若左右子结点都有覆盖,那么便可以在它的上层父结点来安置摄像头,而此层不用安装if (left == 2 && right == 2) {return 0;}//情况2:只要左右子结点有一个没被覆盖,由于是从下向上覆盖,那么此结点理所应当就要安置摄像头else if (left == 0 || right == 0) {result++;return 1;}//情况3:如果左右子结点有一个安了摄像头,那么此结点必然能被覆盖else if (left == 1 || right == 1) {return 2;}//为了不报编译错误而添加,理论上不会走到这里return -1;}public int minCameraCover(TreeNode root) {result = 0;//若root没被覆盖,要单独给root安一个摄像头if (traverse(root) == 0) {result++;}return result;}
}

【算法】贪心算法:LeetCode 714 买卖股票的最佳时机含手续费 、LeetCode 968 监控二叉树相关推荐

  1. _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树

    _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...

  2. 力扣算法JS LC [714. 买卖股票的最佳时机含手续费] LC [968. 监控二叉树]

    LC 714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你 ...

  3. 代码随想录算法训练营第37天|738. 单调递增的数字,714. 买卖股票的最佳时机含手续费,968. 监控二叉树

    Day 37 738. 单调递增的数字 class Solution { public:int monotoneIncreasingDigits(int n) {string strN = to_st ...

  4. 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树

    文章目录 738. 单调递增的数字 思路 难点:遍历顺序 难点:设置flag 714. 买卖股票的最佳时机含手续费 贪心思路 难点 968. 监控二叉树 思路 难点:如何隔两个节点放一个摄像头 738 ...

  5. 738.单调递增的数字,714. 买卖股票的最佳时机含手续费,968.监控二叉树

    738. 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的. 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 ...

  6. 代码随想录算法训练营第三十七天 | 738.单调递增的数字,714. 买卖股票的最佳时机含手续费,968.监控二叉树,总结

    Day36 周日休息~ 一.参考资料 单调递增的数字 https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9 ...

  7. 【贪心算法】Leetcode 714. 买卖股票的最佳时机含手续费

    [贪心算法]Leetcode 714. 买卖股票的最佳时机含手续费 题目 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. ...

  8. leetcode 714 买卖股票的最佳时机含手续费-动态规划(中等)

    714 买卖股票的最佳时机含手续费-动态规划(中等) 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交 ...

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

    714. 买卖股票的最佳时机含手续费 题目 思路 过一遍,记录第i天是否买入和卖出的最值. 代码 class Solution {public:int maxProfit(vector<int& ...

最新文章

  1. idea插件tomcat8-maven-plugin远程部署项目~
  2. mysql报错:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 解决方法
  3. 进度条tqdm基本用法
  4. javadoc maven_Maven Fluido Skin和Javadoc类图
  5. 蛋疼的中文编码及其计算机编码历史
  6. linux shell运行脚本命令行参数,shell脚本命令行参数简介
  7. php中文分词类 关键词提取,php如何使用PHPAnalysis提取关键字中文分词
  8. VMware卸载不干净导致的重装失败(100%解决问题)
  9. 图像格式(YUYV)
  10. 抖音视频什么时候投放dou+最好,dou+投放实战总结:国仁网络资讯
  11. c语言%.4f,4f,4F法则是什么
  12. 2019牛客暑期多校训练营(第八场)E.Explorer
  13. NEO dapp开发系列课程 第一组 第二讲
  14. 悟空遥控器 android 5.1,悟空遥控器服务端
  15. Android6.0 打开自启动管理页面(华为、小米)
  16. 关于TI XDS100V1和XDS100V3仿真器电脑无法识别的解决办法
  17. android sim卡槽,一加5怎么装卡/插卡 一加手机5 SIM卡安装图文教程
  18. HTML动画部分——项目西游记动画
  19. 学会阅读源码后,我觉得自己better了
  20. Fed-SCNN: A Federated Shallow-CNN Recognition Framework for Distracted Driving

热门文章

  1. 基于STM32的门禁系统源码分享
  2. Mybatis Plugin 以及Druid Filer 改写SQL
  3. 【雷达通信】基于matlab雷达探测威力仿真【含Matlab源码 1974期】
  4. 【无标题】.NET?MemoryCache如何清除全部缓存学习通http://www.bdgxy.com/
  5. 自己封装的poi操作Excel工具类
  6. rsync,nfc,sersync使用
  7. 目标跟踪(1)基于OpenCV实现单目标跟踪
  8. python批量采集欢乐之源——表情包数据~
  9. 计算机运行库,VC2010运行库
  10. 预训练权重到底是个啥