Problem
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).
Solution
题意
问题的场景是买卖股票。
给定一个大小为n的(但输入中是没有明显地给出来的,此处只是为了阐述题意方便所以设它的大小为n)数组,第i个元素的代表第i天股票的价格。
要求设计一个算法求得可获得利润的最大值。在这n天内,只能买卖一支股票(也就是说不能像现实世界中先买几股,等过几天价格低了又卖几股...)换个说法就是,只有一个苹果,你今天买了它,明天就没得继续买,必须要卖出去之后才能再买这个苹果。
在这n天中,交易的次数是没有限制的。
分析
这道题很有意思(当然也可能是我太笨了···)一开始的想法是,设计一个算法,求出在这n天内通过合理的买卖次数,获得利润的最大值。
比如说,给定的价格序列为[1, 3, 5, 2, 4],那么我应该找出的算法就应该是,在第一天买,第三天卖;第四天买,第五天卖。当然因为这个数组比较简单,所以一眼就能看出来。但是稍微复杂一点,就比较伤脑筋了。
但是···想了很久没有想出来,然后看了LeetCode上面的Discuss后···我深深感到自己的智商缺陷。
这道题的正确解法,也是最简单的解法就是,只要第i-1天的价格比第i天低,那就买;换句话说,只要第i+1天的价格比第i天高,那就卖。
重点就是在这几天中买卖的次数是没有限制的,只要有钱赚那就可以买或者卖。
Code
//Runtime: 6ms
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++){
if (prices[i - 1] < prices[i])
result += prices[i] - prices[i - 1];
}
return result;
}
};