您的位置:首页 > Web前端

Array-Best Time to Buy and Sell Stock with Transaction Fee

2017-12-02 12:45 417 查看
Description:

Your are given an array of integers prices, for which the i-th element is the price of a given stock on day i; and a non-negative integer fee representing a transaction fee.

You may complete as many transactions as you like, but you need to pay the transaction fee for each transaction. You may not buy more than 1 share of a stock at a time (ie. you must sell the stock share before you buy again.)

Return the maximum profit you can make.

Example 1:

Input: prices = [1, 3, 2, 8, 4, 9], fee = 2
Output: 8
Explanation: The maximum profit can be achieved by:
Buying at prices[0] = 1
Selling at prices[3] = 8
Buying at prices[4] = 4
Selling at prices[5] = 9
The total profit is ((8 - 1) - 2) + ((9 - 4) - 2) = 8.


Note:

0 < prices.length <= 50000.
0 < prices[i] < 50000.
0 <= fee < 50000.


Solution:

//动态规划,到第i天有两种状态,一种是持有股票并且最大利润,有两种选择,一个是什么都不做,一个是买入股票,一种是未持有股票并且最大利润,也有两种选择,一种是什么都不做,一种是卖出股票,我们用两个数组分别保存,每次得到最优解即可,
class Solution {
public int maxProfit(int[] prices, int fee) {
int l = prices.length;
int[] hold = new int[l + 1]; //Hold the stock until day i;
int[] notHold = new int[l + 1]; //Do not hold the stock until day i;
hold[0] = Integer.MIN_VALUE;

for (int i = 1; i <= l; i++) {
hold[i] = Math.max(hold[i - 1], notHold[i - 1] - prices[i - 1] - fee);
notHold[i] = Math.max(notHold[i - 1], hold[i - 1] + prices[i - 1]);
}

return notHold[l];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: