漫画:寻找股票买入卖出的最佳时机(整合版)(上)

简介: 让我们来举个例子,给定如下数组:该数组对应的股票涨跌曲线如下:显然,从第2天价格为1的时候买入,从第5天价格为8的时候卖出,可以获得最大收益。

 640.png640.png640.png640.png640.png640.png

什么意思呢?让我们来举个例子,给定如下数组:

640.png

该数组对应的股票涨跌曲线如下:

 640.png

显然,从第2天价格为1的时候买入,从第5天价格为8的时候卖出,可以获得最大收益:

 

640.png

 

此时的最大收益是 8-1=7

 640.png640.png640.png640.png640.png

 

在上面这个例子中,最大值9在最小值1的前面,我们又该怎么交易?总不能让时间倒流吧?

640.png640.png

 

 

————————————

640.png640.png640.png640.png640.png640.png

以下图为例,假如我们已经确定价格4的时候为卖出时间点,那么此时最佳的买入时间点是哪一个呢?

 640.png

我们要选择价格4之前的区间,且必须是区间内最小值,显然,这个最佳的选择是价格2的时间点。

 640.png640.png

 

1,初始化操作,把数组的第1个元素当做临时的最小价格;最大收益的初始值是0

640.png

 

2,遍历到第2个元素,由于2<9,所以当前的最小价格变成了2;此时没有必要计算差值的必要(因为前面的元素比它大),当前的最大收益仍然是0

 

640.png

3,遍历到第3个元素,由于7>2,所以当前的最小价格仍然是2;如我们刚才所讲,假设价格7为卖出点,对应的最佳买入点是价格2,两者差值7-2=55>0,所以当前的最大收益变成了5

 640.png

 

4,遍历到第4个元素,由于4>2,所以当前的最小价格仍然是24-2=22<5,所以当前的最大收益仍然是5

 

640.png

 

5,遍历到第5个元素,由于3>2,所以当前的最小价格仍然是23-2=11<5,所以当前的最大收益仍然是5

640.png

以此类推,我们一直遍历到数组末尾,此时的最小价格是1;最大收益是8-1=7

 

public class StockProfit {
    public static int maxProfitFor1Time(int prices[]) {
        if(prices==null || prices.length==0) {
            return 0;
        }
        int minPrice = prices[0];
        int maxProfit = 0;
        for (int i = 1; i < prices.length; i++) {
            if (prices[i] < minPrice) {
                minPrice = prices[i];
            } else if(prices[i] - minPrice > maxProfit){
                maxProfit = prices[i] - minPrice;
            }
        }
        return maxProfit;
    }
    public static void main(String[] args) {
        int[] prices = {9,2,7,4,3,1,8,4};
        System.out.println(maxProfitFor1Time(prices));
    }
}

640.png640.png640.png640.png640.png640.png640.png640.png

 

我们以下图这个数组为例,直观地看一下买入卖出的时机:

 

在图中,绿色的线段代表价格上涨的阶段。既然买卖次数不限,那么我们完全可以在每一次低点都进行买入,在每一次高点都进行卖出。

这样一来,所有绿色的部分都是我们的收益,最大总收益就是这些局部收益的加总:

6-1+8-3+4-2+7-4 = 15

至于如何判断出这些绿色上涨阶段呢?很简单,我们遍历整个数组,但凡后一个元素大于前一个元素,就代表股价处于上涨阶段。

640.png

 

 

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

640.png640.png640.png640.png640.png640.png640.png640.png


相关文章
|
算法
【动态规划刷题 7】 买卖股票的最佳时机含冷冻期&& 买卖股票的最佳时机含手续费
【动态规划刷题 7】 买卖股票的最佳时机含冷冻期&& 买卖股票的最佳时机含手续费
|
6月前
|
算法
算法编程(五):买卖股票的最佳时机
算法编程(五):买卖股票的最佳时机
45 0
|
6月前
|
算法
【力扣】121. 买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ
【力扣】121. 买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ
|
6月前
代码随想录 Day43 动态规划11 LeetCode T309 买卖股票的最佳时期含冷冻期 T714买卖股票的最佳时机含手续费
代码随想录 Day43 动态规划11 LeetCode T309 买卖股票的最佳时期含冷冻期 T714买卖股票的最佳时机含手续费
51 0
|
6月前
|
算法 C++
买卖股票的最佳时机(C++)
买卖股票的最佳时机(C++)
51 0
|
12月前
|
算法
代码随想录算法训练营第五十天 | LeetCode 309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费、股票系列总结
代码随想录算法训练营第五十天 | LeetCode 309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费、股票系列总结
75 1
算法练习Day49|● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II
算法练习Day49|● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II
算法修炼Day51|● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费
算法修炼Day51|● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费
|
算法
Leecode121. 买卖股票的最佳时机
Leecode121. 买卖股票的最佳时机
35 0
|
算法
买卖股票的最佳时机II
买卖股票的最佳时机II
63 0