股神之路

  • 买股票最佳时机
  • 买股票最佳时机2
  • 309. 最佳买卖股票时机含冷冻期
  • 714. 买卖股票的最佳时机含手续费

买股票最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:

输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 =
6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入:prices = [7,6,4,3,1] 输出:0 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

1 <= prices.length <= 105
0 <= prices[i] <= 104

思路:

用一个变量记录当前前面的最小值,如果当前值大于它,则作差得利润,取最大的利润返回即可

Java代码

class Solution {public int maxProfit(int[] prices) {int minValue = prices[0];int res = 0;for (int i = 0; i < prices.length; i++) {if (prices[i] > minValue) {res = Math.max(res,prices[i] - minValue);}minValue = Math.min(minValue,prices[i]);}return res;}
}

python代码

class Solution:def maxProfit(self, prices: List[int]) -> int:minValue = prices[0]res = 0for price in prices:if price > minValue:res = max(res,price - minValue)minValue = min(minValue,price)return res

买股票最佳时机2

给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: prices = [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格
= 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

输入: prices = [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格
= 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入: prices = [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104

思路:

若当天股票值大于前一天的值则可以获得利润,将所有当天大于前一天的差当做利润,将所有利润累加到一起即可

python3

class Solution:def maxProfit(self, prices: List[int]) -> int:res = 0for i in range(1,len(prices)):if prices[i] > prices[i - 1]:res = prices[i] - prices[i - 1] + resreturn res

python3动态规划解法

class Solution:def maxProfit(self, prices: List[int]) -> int:n = len(prices)dp = [[0 for i in range(2)] for i in range(n)]dp[0][1] = -prices[0]for i in range(1, len(prices)):dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i])dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1])return dp[n - 1][0]

309. 最佳买卖股票时机含冷冻期

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例:

输入: [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

思路
使用dp[i][0]表示当前天持有股票的最大利润,dp[i][1]为当天不持有股票且当天结束进入冷冻期,即当天将股票卖出的最大利润,dp[i][2]表示当天不持有股票且不进入冷冻期的最大利润,即当天不持有且不卖出股票。

python3代码

class Solution:def maxProfit(self, prices: List[int]) -> int:n = len(prices)dp = [[0 for i in range(3)] for i in range(n)]dp[0][0] = -prices[0]for i in range(1,n)://前一天持有股票今天不卖出和前一天不持有股票且不在冷冻期今天买入取大的值dp[i][0] = max(dp[i - 1][0],dp[i - 1][2] - prices[i])//当天进入冷冻期,则为前一天持有的值加今天卖出的值dp[i][1] = dp[i - 1][0] + prices[i]//当天不持有也不卖值是前一天卖的值和前一天不持有也不卖的值dp[i][2] = max(dp[i - 1][1],dp[i - 1][2])return max(dp[n - 1][1],dp[n - 1][2])

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

思路
本题与买股票最佳时机几乎相同,直接动态规划,并优化下空间

Java代码

class Solution {public int maxProfit(int[] prices, int fee) {int n = prices.length;int sell = 0, buy = -prices[0];for (int i = 1; i < n; ++i) {int sell1 = Math.max(sell, buy + prices[i] - fee);int buy1 = Math.max(buy, sell - prices[i]);sell = sell1;buy = buy1;}return sell;}
}

力扣股神之路动态规划相关推荐

  1. 力扣K神图解算法数据结构解析04

    力扣K神图解算法数据结构点这里 四.搜索与回溯算法 DFS,本质是递归 递推参数 终止条件 递推工作 回溯 BFS,本质是队列 queue<int> que; que.push(第一个参数 ...

  2. 力扣K神图解算法数据结构解析10

    力扣K神图解算法数据结构点这里 十.分治算法 剑指07,重建二叉树 //时间O(n),空间O(n) //自己一直觉得这道题很难,没想到还是能够拿下,其实理论也清楚,前序遍历和中序遍历 //关键如下 / ...

  3. 力扣刷题之路 38. 外观数列 Python解

    给定一个正整数 n ,输出外观数列的第 n 项. 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述. 你可以将其视作是由递归公式定义的数字字符串序列: countAndS ...

  4. 力扣回文字串的动态规划解法

    1,求字符串中,回文子串的个数 647. 回文子串 :给定一个字符串,你的任务是计算这个字符串中有多少个回文子串.具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串.求回文 ...

  5. 力扣刷题之路——59. 螺旋矩阵 II

    题目描述: 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 1: 输入:n = 3 输出:[[1,2,3],[ ...

  6. 《巴菲特之道》精髓:巴菲特的股神进阶之路和投资方法

    <巴菲特之道>书中的精髓:巴菲特的股神进阶之路和投资方法. 在投资人心中,巴菲特是神一样的存在,和他吃一顿饭要花300多万美元,而饭本身只值100美元. 为什么巴菲特投资这么厉害呢?他有什 ...

  7. LeetCode 第 58 场力扣夜喵双周赛(动态规划、马拉车算法,前后缀处理)/ 第 253 场力扣周赛(贪心,LIS)

    第 58 场力扣夜喵双周赛 两道600多 5193. 删除字符使字符串变好 题目描述 一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 . 给你一个字符串 s ,请你从 s 删除 最少 ...

  8. 力扣刷题记录-动态规划问题总结

    百度百科里对于动态规划问题是这样解释的: 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.因此各个阶段 ...

  9. LeetCode 第 59 场力扣夜喵双周赛(最短路径数+迪杰斯特拉、动态规划+最长公共前缀问题) / 第255场周赛(二进制转换,分组背包,子集还原数组(脑筋急转弯))

    第 59 场力扣夜喵双周赛 两道400多五百,后两道都写出代码来了,但是都有问题,哭辽- 还有刚开始第一道测试好慢,搞心态了 5834. 使用特殊打字机键入单词的最少时间 有一个特殊打字机,它由一个 ...

最新文章

  1. 计算机科学 第四次,计算机科学与技术第4次上机实验(25页)-原创力文档
  2. 安卓通讯录系统mysql_Android手机通讯录项目开发--联系人数据库contacts2.db介绍
  3. AD 脚本kixtart运用之五(用户电脑屏保设置)
  4. sap委外采购订单冲销 102_SAP那些事-实战篇-68-谈谈SAP的库存设计理念
  5. 为什么要使用MQ消息中间件?
  6. 7000条短信接口!福利赠送!
  7. RTX51 tiny——51MCU上的多任务操作系统(转)
  8. 什么是容器服务_即学即用Docker(一):说说容器和Docker
  9. 【合宙GSM模块Air202 烧录iRTU固件连接阿里云】
  10. 机器人理论简介—— 台湾交通大学机器人学公开课(一)
  11. Android 中奖滚动效果
  12. 宣纸一笔,思重于行——聊一聊思考的价值
  13. android studio 实例代码,android studio学习之一(示例代码)
  14. 一套实用性最强的商业方案,让他白手起家做到全国十大财阀之一!
  15. Linux操作系统概述
  16. [论文阅读笔记15]Recognizing Complex Entity Mentions:A Review and Future Directions
  17. 【济州岛新任市长支持优秀ICO项目】
  18. 2018十大最热门编程语言排行榜出炉,Java竟不是第一!
  19. 运算器设计(计算机组成实验)1
  20. 3dMax 入门(高脚杯)

热门文章

  1. egret(白鹭引擎) 学习历程(二)
  2. Ubuntu 18.04 LTS版本 谷歌拼音输入法安装
  3. cassandra 官方wiki
  4. sklearn之feature_importance_参数的学习
  5. 我的开源项目,趣享GIF源代码已正式公开
  6. 一个软件测试人员的经验分享
  7. python-图片上添加字符
  8. 基于AVX256指令集和多线程优化的双机计算加速程序
  9. Arrays.deepToString()与Arrays.toString()的区别
  10. 如何进行系统安全评估