碎片时间学算法(2)-买卖股票的最佳时机

题目

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出,
这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,
这笔交易所能获得利润 = 6-3 = 3 。  

示例 2

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出,
这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

解题思路
一开始确实把题目搞复杂化了,思考方向有些偏差,想的是优先取最大利润,所以以整个数组为维度,但忽略了交易的频次。比如[1,2,3,4,5]这个数组,题目给的示例是第一天买第五天卖,这样就需要循环遍历数组找出获取最大利润的买点和卖点。如果相同的方法放在示例1是不可行的。所以我结合了这两种示例,考虑使用贪心算法解决。

贪心算法是指在对问题求解时,总是做出在当前看来是最好(即最有利)的选择从而希望导致结果是最好或最优的算法。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。一般分为几步。

  1. 把求解的问题分成若干个子问题。
  2. 对每一子问题求解,得到子问题的局部最优解。
  3. 把子问题的解局部最优解合成原来解问题的一个解。

所以得出了一下算法

代码实现

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

总结就是,只要第二天的价格比今天的高就卖掉,落袋为安。
不过,题外话。要是真的存在这种数组多好,那就可以知道未来几天的涨跌和买点卖点啦

    原文作者:程序猿Jeffrey
    原文地址: https://www.jianshu.com/p/767a1c2d96ee
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞