LeetCode 笔记23 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.

现在A股涨这么好,要是股票都提前知道价格就好了(@[email protected])

首先,考虑如果至多只能做一次交易呢?

那很简单嘛,大家都知道O(n^2)的方法,两个循环,确定(buyDay, sellDay)取到最大的profit。

怎么优化呢?

其实如果只做一次交易,那么遍历一次数组就可以了。

从0开始,到最后一天。在遍历到第i天的时候,我们用prices[i]减去当前所知道的最小的price,看一下是否比当前max profit大,如果是,就更新max profit。

我们不用关心后面的更小值哦,因为它们不影响当前profit,毕竟你只有先买了才能卖。

同理也可以从最后一天开始往前遍历,这时候我们不记录当前所知道的最小price,而是最大值,用最大值减去prices[i]来和max profit比较。代码在这下面。

public int maxProfit(int[] prices) {
        if (prices.length <= 1) {
            return 0;
        }
        int maxProfit = 0;
        int minIndex = 0;
        for(int i = 1; i < prices.length; i++) {
            if (prices[i] < prices[minIndex]) {
                minIndex = i;
            }
            if (prices[i] - prices[minIndex] > maxProfit) {
                maxProfit = prices[i] - prices[minIndex];
            }
        }
        return maxProfit;
    }

然后我们来看如何计算”买卖两次“的最大profit。

因为有了买卖一次的交易算法,我们比较容易去这样想。把整个个prices数组分成两部分,计算前一部分买卖一次的最大值,计算后一部分买卖的最大值,然后求和。然后从0到length重复该操作,求出整个数组上买卖两次的最大值。

不过这样复杂度变成了O(n^2)。

有没有更好的方法呢?

其实这样想,我们在计算买卖一次的遍历过程中,已经有这样的信息了,那就是,在第0天到第i天,买卖一次能得到的最大profit,假设是forward[i]。同理,如果从后面往前遍历的过程中,我们拿到从第i天到最后一天,买卖一次能得到的最大profit,假设是backward[i]。

于是我们最后一步要求的不就是max(forward[i] + backward[i] for i = 0... length)嘛?这样O(n)就能求出来了。

代码如下:

public int maxProfit(int[] prices) {
        int[] maxProfit = new int[prices.length];
        if (prices.length <= 1) {
            return 0;
        }
        //forward
        int minIndex = 0;
        for(int i = 1; i < prices.length; i++) {
            if (prices[i] < prices[minIndex]) {
                minIndex = i;
            }
            maxProfit[i] = Math.max(maxProfit[i], prices[i] - prices[minIndex]);
        }
        //backward
        int maxIndex = prices.length - 1;
        int ret = 0;
        int iMax = 0;
        for(int i = prices.length - 2; i >= 0; i--) {
            if (prices[i] > prices[maxIndex]) {
                maxIndex = i;
            }
            iMax = Math.max(iMax, prices[maxIndex] - prices[i]);
            ret = Math.max(ret, iMax + maxProfit[i]);
        }
        return ret;
    }

注意我们没有使用backward[i],因为第二次遍历直接就能得到max profit了。

时间: 2024-12-28 02:32:51

LeetCode 笔记23 Best Time to Buy and Sell Stock III的相关文章

leetcode笔记:Best Time to Buy and Sell Stock III

一. 题目描述 Say you have an array for which the i-th 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

【leetcode刷题笔记】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. Note:You may not engage in multiple transactions at the same time (ie,

leetcode笔记:Best Time to Buy and Sell Stock

一. 题目描述 Say you have an array for which the i-th element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum pro

leetcode || 123、Best Time to Buy and Sell Stock III

problem: 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

leetcode第一刷_Best Time to Buy and Sell Stock III

这道题还是挺难的,属于我前面提到的,给个数组,线性时间找出个什么东西,尽管上面的两个买卖股票也是这类.只是相比之下稚嫩多了.有关至少至多的问题比較烦人,不好想,等再做一些题,可能会发现什么规律.这道题的情况还是比較少的,要么买卖了两次.要么一次. 买卖一次的情况,已经解决过了,如今分析买卖两次的情况. 两次买卖之间是没有交叉的,即下一次买之前一定已经卖掉了.最easy想到,穷去分点,每一个部分都依照买卖一次的方法做. 好,恭喜.你已经走在超时的路上了.那么怎么办呢.有没有一种方法,在线性时间内,

Best Time to Buy and Sell Stock III leetcode java

题目: 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

leetcode第一刷_Best Time to Buy and Sell Stock II

sched.c sched.h 代码分析笔记 首先上header file sched.h #ifndef _SCHED_H #define _SCHED_H #define HZ 100 #define NR_TASKS 64 #define TASK_SIZE 0x04000000 #define LIBRARY_SIZE 0x00400000 #if (TASK_SIZE & 0x3fffff) #error "TASK_SIZE must be multiple of 4M&qu

leetcode——Best Time to Buy and Sell Stock III 买卖股票最大收益(AC)

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,

【leetcode】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. Note:You may not engage in multiple