1. 程式人生 > >最佳買賣股票時間IV

最佳買賣股票時間IV

假設你有一個數組,它的第i個元素是一支給定的股票在第i天的價格。

設計一個演算法來找到最大的利潤。你最多可以完成 k 筆交易。

注意事項

你不可以同時參與多筆交易(你必須在再次購買前出售掉之前的股票)

您在真實的面試中是否遇到過這個題?Yes樣例

給定價格 = [4,4,6,1,1,4,2,5], 且 k = 2, 返回 6.

挑戰

O(nk) 時間序列。

點題:這道題花了我很長時間來理解,特別是global/local演算法模式,理解起來比較費力。但是下面的演算法理解起來就要容易很多。

class Solution {
public:
    /*
     * @param K: An integer
     * @param prices: An integer array
     * @return: Maximum profit
     */
    int maxProfit(int K, vector<int> &prices) {
        // write your code here
        if (K == 0 || prices.size() < 2) {
            return 0;
        }
        // trade as more as possible
        if (K >= prices.size()) {
            int max_profix = 0;
            for (int i = 1; i < prices.size(); i++) {
                if (prices[i] > prices[i - 1]) {
                    max_profix += (prices[i] - prices[i - 1]);
                }
            }
            return max_profix;
        }
        vector<vector<int>> buy(prices.size() + 1, vector<int>(K + 1, INT_MIN));
        vector<vector<int>> sell(prices.size() + 1, vector<int>(K + 1, 0));
        for (int i = 1; i <= prices.size(); i++) {
            for (int j = 1; j <= K; j++) {
                buy[i][j] = max(buy[i - 1][j], sell[i - 1][j - 1] - prices[i - 1]);
                sell[i][j] = max(sell[i - 1][j], buy[i - 1][j] + prices[i - 1]);
            }
        }
        return sell[prices.size()][K];
    }
};

http://blog.csdn.net/jc69186918/article/details/54926277