0. 题目
给定一个数组,它的第 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 <= prices.length <= 3 * 10 ^ 4
0 <= prices[i] <= 10 ^ 4
1.我的思路
我最开始的思路错了,我开始琢磨起二维数组来了,后来发现各种各样的可能性,难道需要把这些可能性都记住?断断续续在休息的间隙思考了一天,晚上在食堂吃饭的时候突然想到自己不需要给出所有买卖的过程,只需要关注盈利的结果,也就是多有可以赚钱的交易。最简单的就是昨天买了,今天卖出是否挣钱。昨天买了今天涨了,明天也涨了,明天卖出的,也是挣的(今天-昨天)+(明天-今天)
,所以根本不需要关注哪天买入哪天抛售。故我的题解为:
class Solution {
public int maxProfit(int[] prices) {
int maxProfit = 0;
int pricesLength = prices.length;
int[] profitArray = new int[pricesLength];
for (int i = 0; i < pricesLength; i++) {
int j = i + 1;
if (j < pricesLength && prices[j] > prices[i]) {
profitArray[j] = prices[j] - prices[i];
}
}
for (int i = 0; i < profitArray.length; i++) {
maxProfit += profitArray[i];
}
return maxProfit;
}
}
2. 官方题解
class Solution {
public int maxProfit(int[] prices) {
int maxprofit = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1])
maxprofit += prices[i] - prices[i - 1];
}
return maxprofit;
}
}
3.我的感想
有时候思考问题感觉很难,并不是自己笨,而是努力的方向不对。没有看清关键的影响因素,没有抓住问题的本质。我的答案与正确答案还是有一定的差距,我多申请了一个数组去装所有盈利的日子,但是这是不必要的,我们只需要求得一个和即可。只有在我们需要给出交易的具体步骤时,才需要记录下来这样的盈利的日子。
有的朋友说题目的前提条件有点不现实,说购买之前必须全部抛售。我倒是觉得非常正常,就是在你没有多少本金的情况下进行交易的真实状况。
来源:oschina
链接:https://my.oschina.net/hengbao666/blog/4557598