ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-12-17 13:03:42  阅读:186  来源: 互联网

标签:状态 fee 买卖 持有 股票 最佳时机 手续费 prices dp


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

给定一个整数数组prices,其中第i个元素代表了第i天的股票价格;非负整数fee代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

示例

输入: 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.

题解

/**
 * @param {number[]} prices
 * @param {number} fee
 * @return {number}
 */
var maxProfit = function(prices, fee) {
    const n = prices.length;
    const dp = new Array(2).fill(0).map(v => new Array(n).fill(0));
    dp[0][0] = -prices[0];
    dp[1][0] = 0;
    for (let i = 1; i < n; ++i) {
        // 该点最终状态为持有:继续持有/未持有买入
        dp[0][i] = Math.max(dp[0][i - 1], dp[1][i - 1] - prices[i]);
        // 该点最终状态为持有未持有:继续未持有/持有卖出
        dp[1][i] = Math.max(dp[1][i - 1], dp[0][i - 1] + prices[i] - fee);
    }
    return dp[1][n - 1];
};

思路

动态规划的方式,根据题目示例,可以打印一个表格。

状态 1 3 2 8 4 9
持有 -1 -1 -1 -1 1 1
未持有 0 0 0 5 5 8

需要解释一下这个表格,考虑到不能同时参与多笔交易,因此每天交易结束后只可能存在手里有一支股票或者没有股票的状态,我们给予其两个状态,第一个持有状态为持有,即第i天交易完后手里持有一支股票的最大利润,第二个为未持有状态,即第i天交易完后手里没有股票的最大利润,考虑dp[0][i]按状态转移,那么可能的转移状态为前一天已经持有一支股票,即dp[1][i−1],或者前一天结束时还没有股票即dp[1][i−1],这时候我们要将其买入,并减prices[i]的收益,可以列出如下的转移方程dp[1][i]=max{dp[1][i−1],dp[0][i−1]−prices[i]};同样再考虑考虑dp[1][i]的转移方程,如果这一天交易完后手里没有股票,那么可能的转移状态为前一天已经没有股票,即dp[1][i−1],或者前一天结束的时候手里持有一支股票,即dp[0][i−1],这时候我们要将其卖出,并获得prices[i]的收益,但需要支付fee的手续费,因此为了收益最大化,我们列出如下的转移方程dp[0][i]=max{dp[0][i−1],dp[1][i−1]+prices[i]−fee},对于所有的初始化状态,根据状态定义我们可以知道第0天交易结束的时候有dp[0][0]=0以及dp[1][0]=−prices[0],之后只要从前往后依次计算状态即可。首先定义n为数组长度,直接使用构造函数生成一个2 * n的数组并将其填充为0,外层数组填充0的原因是map会跳过empty数组空位,实际上在外层数组填充任何值都可以,会使用map回调函数的返回值覆盖,之后定义初始化的第一列的值,之后定义循环,构建列表,具体的规则可以参考上述的表格解释,之后返回第二行的最后一个值即可。

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/

标签:状态,fee,买卖,持有,股票,最佳时机,手续费,prices,dp
来源: https://www.cnblogs.com/WindrunnerMax/p/14149027.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有