前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【前端算法】买卖股票的最佳时机含手续费—— 贪心算法、动态规划实现

【前端算法】买卖股票的最佳时机含手续费—— 贪心算法、动态规划实现

作者头像
徐小夕
发布于 2022-02-09 06:17:02
发布于 2022-02-09 06:17:02
34900
代码可运行
举报
文章被收录于专栏:趣谈前端趣谈前端
运行总次数:0
代码可运行

题目描述

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

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

返回获得利润的最大值。

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

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: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

提示:

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/be…[1] 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

思路1:动态规划实现

动态规划三部曲

  • 定义dp含义
    • 定义dp[n][2]:
    • n代表第n天有2种状态,持有或者不持有
    • dp[i][0] 第i天不持有获得的最大利润;
    • dp[i][1] 第i天持有获得的最大利润;(tip:是持有不是买入)
  • 定义状态转移方程: 对于今天不持有,可以从两个状态转移过来:1. 昨天也不持有;2. 昨天持有,今天卖出且支付手续费fee。两者取较大值。 对于今天持有,可以从两个状态转移过来:1. 昨天也持有;2. 昨天不持有,今天买入。两者取较大值。
    • dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);
    • dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
  • 初始化dp;
    • 不持有:dp[0][0]=0;
    • 持有:dp[0][1]=-prices[0] ((即花了price[0] 的钱买入))

由于dp[n][0]>dp[i][1],当天不持有股票利润一定大于当天持有股票,因此返回dp[len-1][0]即可

时空复杂度
  • 时间复杂度:O(n),遍历一遍即可。
  • 空间复杂度:O(n)
代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function maxProfit(prices: number[], fee: number): number {
    
    let len=prices.length;
     // define dp
     let dp=new Array(len);
     for(let i=0;i<len;i++){
         dp[i]=new Array(2).fill(0);
     }
     // init dp 
     dp[0][0]=0;
     dp[0][1]=-prices[0];
     for(let i=1;i<len;i++){
         dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]-fee);
         dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);
     }
     console.log(dp);
    return dp[len-1][0]
};

优化
降维:状态转移的时候,dp[i] 只会从 dp[i-1] 转移得来,因此第一维可以去掉:
时空复杂度
  • 时间复杂度:O(n),遍历一遍即可。
  • 空间复杂度:O(1)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 function maxProfit(prices: number[], fee: number): number {
    
    let len:number=prices.length;
     // define dp
     let dp=new Array(2);

     // init dp 
     dp[0]=0;
     dp[1]=-prices[0];
     for(let i=1;i<len;i++){
         let temp=dp[0]
         dp[0]=Math.max(dp[0],dp[1]+prices[i]-fee);
         dp[1]=Math.max(temp-prices[i],dp[1]);
     }
     console.log(dp);
    return dp[0]
};

思路2:贪心算法
  • 将手续费买入时进行计算,即可得到一种贪心的方法;
  • 我们定义buy表示:最大化利益的前提下,当我们手上有一只股票时,那么他的买入最低价格。
    • profit=prices[i]-buy;
    • 但是此时我们卖出可能不是最优解,比如:第二天价格继续上升;
    • 因此我们可以假设有个反悔操作,假设当前手上有一只买入价格为prices[i]的股票,
    • 将buy更新为prices[i]:buy=prices[i] ;
    • 如果第二天价格继续上升,我们将获得prices[i+1]-prices[i],此时,加上前一天prices[i]-buy的收益,
    • 由上可知,相当于当天不做任何操作,而在第二天卖出:prices[i+1]-buy
    • 初始化为buy=prices[0]+fee;
    • 如果当前股票prices[i]+fee<buy;则我们更新最低买入价格buy;
    • 如果当前股票大于buy,则我们可以直接卖出获得利润
    • 其余情况,不值得卖出;
时空复杂度
  • 时间复杂度:O(n),遍历一遍即可。
  • 空间复杂度:O(1)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function maxProfit(prices: number[], fee: number): number {
  let len=prices.length;
  let buy=prices[0]+fee;
  let profit=0;
  for(let i=1;i<len;i++){
      if(prices[i]+fee<buy){
          buy=prices[i]+fee;
      }else if(prices[i]>buy){
          profit+=prices[i]-buy
          buy=prices[i]
      }
  }// end of for 
  return profit
};

参考资料

[1]https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee: https://link.juejin.cn/?target=https%3A%2F%2Fleetcode-cn.com%2Fproblems%2Fbest-time-to-buy-and-sell-stock-with-transaction-fee

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣谈前端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动态规划:买卖股票的最佳时机含手续费
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
代码随想录
2021/03/16
4700
leetcode每日一题:714. 买卖股票的最佳时机含手续费
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
用户3578099
2020/12/30
5390
贪心算法:买卖股票的最佳时机含手续费
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
代码随想录
2020/12/31
8000
聊聊买卖股票的最佳时机
最近梳理高频动态规划问题,股票问题当然是非常经典的动态规划问题,并且整个系列有好几道题,这里我整理了6道股票系列的经典问题分享给大家,咱们今天聊聊买卖股票的最佳时机。
bigsai
2022/04/08
5340
聊聊买卖股票的最佳时机
动态规划 —— dp 问题-买卖股票的最佳时机含手续费
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/
迷迭所归处
2024/11/19
930
动态规划 —— dp 问题-买卖股票的最佳时机含手续费
LeetCode 714. 买卖股票的最佳时机含手续费(DP)
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
Michael阿明
2020/07/13
4980
LeetCode 714. 买卖股票的最佳时机含手续费(DP)
用javascript分类刷leetcode3.动态规划(图文视频讲解)
动态规划,英文:Dynamic Programming,简称DP,将问题分解为互相重叠的子问题,通过反复求解子问题来解决原问题就是动态规划,如果某一问题有很多重叠子问题,使用动态规划来解是比较有效的。
js2030code
2022/10/27
4530
【动态规划】【简单多状态dp问题】买卖股票相关问题(冷冻期、手续费、限制次数)
一维表示第 i 天;二维表示交易次数(可加一维表示买入还是卖出,不过我们可以直接用两个表)
椰椰椰耶
2024/11/15
1430
【动态规划】【简单多状态dp问题】买卖股票相关问题(冷冻期、手续费、限制次数)
详解股票买卖算法的最优解(一)
主要用的技巧是“状态机”,那么什么是“状态机”呢?没听过的小伙伴会觉得它很高大尚,但今天我们讨论过后,你会发现其实它就是那么回事。
HUC思梦
2020/09/10
1.3K0
leetcode刷题(63)——714. 买卖股票的最佳时机含手续费
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
老马的编程之旅
2022/06/22
2740
[LeetCode]动态规划,一举歼灭“股票买卖的最佳时机”问题
在[LeetCode]买卖股票的最佳时机ⅠⅡ中,Jungle采用波峰波谷法解决了两道简单题。那么剩余4到题目该如何求解呢?
用户6557940
2022/07/24
4670
[LeetCode]动态规划,一举歼灭“股票买卖的最佳时机”问题
每日算法系列【LeetCode 714】买卖股票的最佳时机含手续费
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
godweiyang
2020/03/24
5060
LeetCode 全站第一,牛逼!
本文地址:https://leetcode-cn.com/circle/article/qiAgHn/
GitHubDaily
2021/02/01
9380
LeetCode 全站第一,牛逼!
leetcode 每日一题:714. 买卖股票的最佳时机含手续费
leetcode 每日一题:714. 买卖股票的最佳时机含手续费:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
用户7685359
2020/12/22
2850
前端用动态规划玩股票II
为什么需要做算法题?大家其实都有发现在这一段2020年开始,各大公司对于前端的面试中,都不同程度的加入了算法题的测试,其中让大家最有感悟的就是字节跳动的前端面试,加入了大量的算法考验,其中不乏有很多在LeetCode上的中等以及困难题目,我也在知乎上发起了一个提问。浏览量上百万,也得到了很多的评论。
LamHo
2022/09/26
2750
前端用动态规划玩股票II
【动态规划dp问题】——leetcode关于买卖股票的最佳时期系列问题
问题: 只能进行一次买卖,求最大利润。 思路: 记录历史最低点 min_price。 遍历数组,计算当前价格与 min_price 的差值作为潜在利润,更新最大利润 max_profit。 时间复杂度 O(n)。
用户11286421
2025/01/17
1110
【动态规划dp问题】——leetcode关于买卖股票的最佳时期系列问题
九十三、动态规划系列之股票问题(下)
股票买卖这一类的问题,都是给一个输入数组,里面的每个元素表示的是每天的股价,并且你只能持有一支股票(也就是你必须在再次购买前出售掉之前的股票),一般来说有下面几种问法:
润森
2022/08/17
3900
搞定大厂算法面试之leetcode精讲3.动态规划
动态规划,英文:Dynamic Programming,简称DP,将问题分解为互相重叠的子问题,通过反复求解子问题来解决原问题就是动态规划,如果某一问题有很多重叠子问题,使用动态规划来解是比较有效的。
全栈潇晨
2021/11/22
4250
搞定大厂算法面试之leetcode精讲3.动态规划
前端用动态规划玩股票
为什么需要做算法题?大家其实都有发现在这一段2020年开始,各大公司对于前端的面试中,都不同程度的加入了算法题的测试,其中让大家最有感悟的就是字节跳动的前端面试,加入了大量的算法考验,其中不乏有很多在LeetCode上的中等以及困难题目,我也在知乎上发起了一个提问。浏览量上百万,也得到了很多的评论。
LamHo
2022/09/26
4310
前端用动态规划玩股票
​LeetCode刷题实战309:最佳买卖股票时机含冷冻期
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/07/06
3240
推荐阅读
相关推荐
动态规划:买卖股票的最佳时机含手续费
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验