Best Time to Buy and Sell Stock III

Best Time to Buy and Sell Stock III

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 at most two transactions.

c++版本代码:

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        int profit = 0, n = prices.size();
        if( n==0 ) {
            return 0;
        }
        int l[n], r[n];
        memset(l, 0, sizeof(int)*n);
        memset(r, 0, sizeof(int)*n);
        int min = prices[0];
        for(int i=1; i<n; i++) {
            l[i] = prices[i] - min > l[i-1] ? prices[i] - min : l[i-1];
            min = prices[i] < min ? prices[i] : min;
        }
        int max = prices[n-1];
        for(int i=n-2; i>=0; i--) {
            r[i] = max - prices[i] > r[i+1] ? max - prices[i] : r[i+1];
            max = prices[i] > max ? prices[i] : max;
        }
        for (int i=0; i<n ;i++) {
            profit = l[i] + r[i] > profit ? l[i] + r[i] : profit;
        }
        return profit;
    }
}; 

  Java版本代码:

public class Solution {
    public int maxProfit(int[] prices) {
     if(prices == null || prices.length == 0) {
         return 0;
     }
     int n = prices.length;
     int[] left = new int[n];
     int[] right = new int[n];
     int min = prices[0];
     for(int i=1; i<n; i++) {
         left[i] = left[i - 1] > prices[i] - min ? left[i - 1] : prices[i] - min;  
         min = min < prices[i] ? min : prices[i];
     }
     int max = prices[n-1];
     for(int i=n-2; i>0; i--) {
         right[i] = right[i + 1] > max - prices[i] ? right[i + 1] : max - prices[i]; 
         max = max > prices[i] ? max : prices[i];
     }
     int profit = 0;
     for(int i=0; i<n; i++) {
         profit = profit > left[i] + right[i] ? profit : left[i] + right[i];
     }
     return profit;
    }
}

  

原文地址:https://www.cnblogs.com/zlz-ling/p/4052873.html