LeetCode122.买卖股票的最佳时机 II(贪心解法-Java)

1.题目

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 
一股 股票。你也可以先购买,然后在同一天出售。
返回你能获得的最大利润。

2.示例

示例 1:

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

示例 2:

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

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,
最大利润为 0

提示:

1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104

3.问题求解

贪心的核心思想就是将大问题拆分成小问题,然后找到小问题的最优解,从而得到整体的最优解!

(1) 如何将问题拆分

首先考虑到最终的利润是由每天的利润积累起来的,那么就可以将总利润拆分成每天的利润的和。

(2)对小问题求最优解

贪心的在对小问题求解时,策略就是做出当前看来最好的那个选择,那么可以考虑的是,只要当天的价格比前一天高,就进行交易(此时就是最好的选择),那么此时第n天和第m天(假设n在m后)相差的利润就是prices[n]-prices[m],该式子可以拆分成(prices[n]-prices[n-1])+……+(prices[m+1]-prices[m])。
以 [1, 2, 3, 4] 为例,计算每天的利润之和的式子为 prices[3] - prices[0]=(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0]) 。
此时就把整个问题转变成考虑每天的利润即可,所以只对利润为正的进行收集就可以了(假设为负的时候被卖出,为正的时候又重新被买回来了)。

(3)求得整体最优解

在(2)的基础上,已经将问题拆分成找每天利润为正的价格,那么就可以分别计算相邻两天价格的差值,如果为正就加到最后的结果中,如果为负就跳过(相当于卖出股票)。

(4)代码实现(Java)

class Solution {
    public int maxProfit(int[] prices) {
        int sum = 0;
        for (int i = 1; i < prices.length; i++) {
        //如果是正数就相加,不是就跳过
            sum += Math.max(prices[i] - prices[i - 1], 0);
        }
        return sum;
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值