Best Time to Buy and Sell Stock III (Java)

来源:互联网 发布:二分搜索算法代码 编辑:程序博客网 时间:2024/06/06 16:36

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.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

这道题有I、II的不同之处在于只能买进两次,而且必须是买进、卖出、再买进、再卖出这样,手中不能超过一只股票。

将I的解法变为从前往后,从后往前遍历两遍,寻找到i的 0...i的最大值以及i...length - 1的最大值,将这两个值相加,找到最大利润。

Source

public class Solution {    public int maxProfit(int[] prices) {    if(prices.length <= 1) return 0;        int min = prices[0];    int[] a = new int[prices.length];        for(int i = 1; i < prices.length; i++){    min = Math.min(min, prices[i]);       //p[0]...p[i]当前数组最小值    a[i] = Math.max(a[i - 1], prices[i] - min); //a[i]存储从0..i的利益最大值        }        int max = prices[prices.length - 1];    int[] b = new int[prices.length];        for(int i = prices.length - 2; i >= 0; i--){    max = Math.max(prices[i], max);    b[i] = Math.max(max - prices[i], b[i + 1]);    }        int maxp = 0;    for(int i = 0; i < prices.length; i++){    maxp = Math.max(maxp, a[i] + b[i]);  //a[i]是从前往后数,b[i]是从后往前数    //所以可以有效避免出现前一次还没卖出后一次就买入的情况,a[i]是从0到i,b[i]是从i到length - 1    }        return maxp;            }}


Test

    public static void main(String[] args){    int[] prices = {1,2,3,6,3};    System.out.println(new Solution().maxProfit(prices));          }


0 0