题目描述(来自力扣)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
我的思路
这道题画一个折线图可以很容易发现利润计算的本质,以[2,1,4,2,3,5,3,5]为例画出折线图

很容易可以发现要获得最大利润,买卖的时间节点为下图中的 ( li, hi ) 相加,其中li为买入股票的时间,hi 为卖出股票的时间

进一步观察可以发现,从 li 到 hi 其实本质上就是折线图中递增的部分,我们计算所得的最大利润,实质就是折线图中递增部分的总和

发现这个规律之后,代码就很容易写了,一个O(n)时间复杂度的方法如下:
class Solution {
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0)
return 0;
int profit = 0;
for (int i = 0; i < prices.length - 1; ++i) {
if (prices[i + 1] > prices[i]) {
profit += (prices[i + 1] - prices[i]);
}
}
return profit;
}
}
该博客主要解析LeetCode Day 5的题目——最佳买卖股票时机II。文章介绍了如何计算在允许多次交易的情况下,能获得的最大利润。通过分析示例输入[7,1,5,3,6,4],得出最大利润为7,并提出通过观察股票价格折线图,找出递增部分求和来确定买卖时间节点的方法。博主分享了一个O(n)时间复杂度的解决方案。"
126219002,10781399,Android数据库操作:LitePal快速入门指南,"['数据库', 'java', 'android', 'ORM框架', 'LitePal框架']

被折叠的 条评论
为什么被折叠?



