[LeetCode] 121. 买卖股票的最佳时机

题目链接 : https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

题目描述:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例:

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

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

思路:

思路一: Kadane's Algorithm参考维基百科

简单介绍一下,如果一个数组为[a1, a2, a3, a4, a5],

a5 - a1 = (a2 - a1) + (a3 - a2) + (a4 - a3) + (a5 - a4)

所以,我们这一题就是找两个差值最大数!

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        res = 0
        cur_max = 0
        for i in range(1, len(prices)):
            # 记录目前位置以i为结束的, 差值最大值
            cur_max += (prices[i] - prices[i-1])
            # 如果 cur_max 小于0 说明要改变起始的位置
            cur_max = max(0, cur_max)
            res = max(res, cur_max)
        return res

java

class Solution {
    public int maxProfit(int[] prices) {
        if (prices == null || prices.length == 0) return 0;
        int cur_max = 0;
        int res = 0;
        for (int i = 1; i < prices.length; i++) {
            cur_max += prices[i] - prices[i - 1];
            cur_max = Math.max(0, cur_max);
            res = Math.max(cur_max, res);
        }
        return res;
    }
}

思路二 : 动态规划,我们可以遍历数组,记录前面最小的价格,用当天价格减去最小价格,一定是这天可以获得最大利润!

def maxProfit(self, prices: List[int]) -> int:
        if not prices: return 0
        res = 0
        cur_min = prices[0]
        for i in range(1, len(prices)):
            res = max(res, prices[i] - cur_min)
            cur_min = min(cur_min, prices[i])
        return res

java

class Solution {
    public int maxProfit(int[] prices) {
        if (prices == null || prices.length == 0) return 0;
        int res = 0;
        int pre_min = prices[0];
        for (int i = 1; i < prices.length; i++){
            res = Math.max(res, prices[i] - pre_min);
            pre_min = Math.min(pre_min, prices[i]);
        }
        return res;  
    }
}

posted on 2019-07-11 19:14  威行天下  阅读(142)  评论(0编辑  收藏  举报

导航