LeetCode题解: 122. Best Time to Buy and Sell Stock II

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 as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

原题地址

此题的意思是可以买卖多次,获得最大利润。实则是一个贪心问题,如果该天的股票价格在后一天涨了,那么就买,第二天卖掉。依次后推。可能有人会提问,为什么如果第二天降价 不买当天的呢,如果买了的话,等以后几天涨价再卖掉就好了啊,还能获得利润的?

如果这样的话,为什么不直接买第二天降价后的呢?这样会获得更大的利润,对吧?

所以只要第二天涨价 那么就买当天的,这样便能获得最大利润。

class Solution {
    public int maxProfit(int[] prices) {
        int sum = 0;
        for (int i = 0; i < prices.length-1; i++) {
            if (prices[i] < prices[i + 1]) sum += prices[i+1] - prices[i];
        }
        return sum;
    }
}
最后提问一个问题,就是如果要获得最大利润,那么所需要的最多的交易数是多少呢?

需要最多的交易数是 n/2向下取整。比如这种情况达到最大的交易数,1,2,3,4 需要两天。如果交易数>[n/2] 那么说明必定在某一天即买又卖。如果是先买后卖的话,那肯定是没有必要的,因为利润增加是0。如果是先卖后买的话,说明在后面的价格还会再涨,那么根本就不需要卖。所以,还是不必要的交易,所以最大的交易数是n/2向下取整。(没有严格的证明,只是简单地分析了一下)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值