一道动态规划当中的简单题目,先拿简单题目加深自己对动态规划的理解。
题目大意:
给定我们一个数组,里面的第i个数字代表第i天的袜子价格,我们所需要做的就是以低价买入,高价卖出。最后我们返回我们可以获得利润的最大值。
例子:
example 1:
Input: [7, 1, 5, 3, 6, 4]
Output: 5
max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)
example 2:
Input: [7, 6, 4, 3, 1]
Output: 0
In this case, no transaction is done, i.e. max profit = 0.
算法:
刚开始阅读这道题目,可能会想到一种算法就是从数组当中找到最小值,然后再找到最大值,相减就是最大利润。但是,这种算法会出错,因为最高价可能会出现在最低价前面。我们利用动态规划的方法来做这道题,首先我们当然要遍历整个数组,对于每个数我们判断其是否比当前最小值要小,然后更新最小值。这样做是为了在后面出现高价的时候,保证我们的利润最大。然后,如果当前值大于最小值,我们就用其减去最小值看看是否利润大于我们当前的利润。然后对于我们的利润进行更新,这样做保证了我们的利润是最大值。这样做的时间复杂度为O(n)。
代码:
class Solution
{
public:
int maxProfit(vector<int>& prices)
{
int len=prices.size();
if(len==0) return 0;
int minn=prices[0],maxx=0;
for(int i=0;i<len;i++)
{
if(prices[i]<minn) minn=prices[i];
if(prices[i]-minn>maxx) maxx=prices[i]-minn;
}
return maxx;
}
};