• LeetCode——Best Time to Buy and Sell Stock III


    Description:

    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天之前(包括第i天)的最大收益,在第i天之后(包括第i天)的最大收益,这样就变成了求一次交易的最大收益了,同系列问题I,

    最后遍历一次求子问题最大收益之和的最大值,就是最后的解。时间复杂度O(n),空间复杂度O(n)

    public class Solution {
        public int maxProfit(int[] prices) {
            int len = prices.length;
            
            if(len == 0) return 0;
            
            int[] leftProfit = new int[len];
            int[] rightProfit = new int[len];
            
            Arrays.fill(leftProfit, 0);
            Arrays.fill(rightProfit, 0);
            
            //计算左边的最大收益,从前向后找
            int lowestPrice = prices[0];
            for(int i=1; i<len; i++) {
                lowestPrice = min(lowestPrice, prices[i]);
                leftProfit[i] = max(leftProfit[i-1], prices[i] - lowestPrice);
            }
            
            //计算右边的最大收益,从后往前找
            int highestPrice = prices[len-1];
            for(int i=len-2; i>=0; i--) {
                highestPrice = max(highestPrice, prices[i]);
                rightProfit[i] = max(rightProfit[i+1], highestPrice-prices[i]);
            }
            
            int maxProfit = leftProfit[0] + rightProfit[0];
            //遍历找出经过最多两次交易后的最大了收益
            for(int i=1; i<len; i++) {
                maxProfit = max(maxProfit, leftProfit[i] + rightProfit[i]);
            }
            
            return maxProfit;
        }
        
        public int min(int a, int b) {
            return a > b ? b : a;
        }
        
        public int max(int a, int b) {
            return a > b ? a : b;
        }
    }
  • 相关阅读:
    Shell基本语法
    CURL简单使用
    <C> 字符串简单习题
    <C> 字符串相关的函数
    <C> 内存分区
    <C> 最大值以及最大值下标 二分查找(折半查找)
    <C> 函数 函数指针
    <C> 冒泡排序及其非常非常非常简单的优化
    <C> typedef 宏 const 位运算
    <C> 数组
  • 原文地址:https://www.cnblogs.com/wxisme/p/4860333.html
Copyright © 2020-2023  润新知