zoukankan      html  css  js  c++  java
  • Best Time to Buy and Sell Stock with Cooldown -- LeetCode

    Say you have an array for which the ith element is the price of a given stock on day i.

    Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times) with the following restrictions:

    • You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
    • After you sell your stock, you cannot buy stock on next day. (ie, cooldown 1 day)

    Example:

    prices = [1, 2, 3, 0, 2]
    maxProfit = 3
    transactions = [buy, sell, cooldown, buy, sell]

    思路:DP。

    因为这个题中有两种操作buy 和 sell,这里我们用buy[i]表示在第i天或之前买入股票所能获得的最大利益(即最后一次交易为买入股票),用sell[i]表示在第i天或之前卖出股票所能获得的最大利益。我们分别考虑转化公式。

    对于buy[i],我们有两种选择,一是这一天不买入股票,则最大利润为buy[i-1];或者这一天买入股票,因为买入股票的前一天不能卖出股票,则最大利润应该是两天之前卖出股票的最大利润减去今日的股价sell[i-2] - prices[i]。所以

    buy[i] = max(buy[i-1], sell[i-2] - prices[i])

    对于sell[i],我们也有两种选择,一是这一天不卖出股票,则最大利润为sell[i-1];或者这一天卖出股票,则为前一天为止买入股票所能获得的最大利润加上今日的股价buy[i-1] + prices[i]。所以

    sell[i] = max(sell[i-1], buy[i-1] + prices[i])

    完整程序:

     1 class Solution {
     2 public:
     3     int maxProfit(vector<int>& prices) {
     4         if (prices.size() == 0) return 0;
     5         vector<int> buy(prices.size());
     6         vector<int> sell(prices.size());
     7         sell[0] = 0;
     8         buy[0] = -prices[0];
     9         for (int i = 1; i < prices.size(); i++) {
    10             buy[i] = std::max(buy[i-1], (i > 1 ? sell[i-2] : 0) - prices[i]);
    11             sell[i] = std::max(sell[i-1], buy[i-1] + prices[i]);
    12         }
    13         return sell.back();
    14     }
    15 };

    实际上,我们可以做到O(1)空间复杂度。

     1 class Solution {
     2 public:
     3     int maxProfit(vector<int>& prices) {
     4         if (prices.size() == 0) return 0;
     5         int prev_sell(0), prev_buy, sell(0), buy(INT_MIN);
     6         for (int i = 0, n = prices.size(); i < n; i++) {
     7             prev_buy = buy;
     8             buy = std::max(prev_buy, prev_sell - prices[i]);
     9             prev_sell = sell;
    10             sell = std::max(prev_sell, prev_buy + prices[i]);
    11         }
    12         return sell;
    13     }
    14 };
  • 相关阅读:
    github免费私有仓库使用
    空间域平滑滤波器
    Matlab常用函数
    图像处理之图像的平滑与锐化
    Matlab实现直方图均衡化
    matlab图像灰度调整——imadjust函数的使用
    调整图像大小调整图片大小
    Matlab 图像平移、旋转、缩放、镜像
    Matlab注释的几个方法
    训练一个神经网络 能让她认得我
  • 原文地址:https://www.cnblogs.com/fenshen371/p/5787018.html
Copyright © 2011-2022 走看看