书接上回
你买股票吗?想知道怎么计算最佳购买时机吗,那么就来看下面这道题吧!!!
题目
题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode) (leetcode-cn.com)
做法一——暴力枚举
1.思想
1.假设我们要在第j天的时候卖出,那么我们需要在前j天枚举出最小值(假设在i天的时候股票价格最低)来寻找我们需要在何时买入,才能保证利润最大。
2.重复1步骤,并选出其中的最大值。
2.缺点
唧唧复唧唧,循环套循环,多次循环会导致时间复杂度急剧增加,此做法中时间复杂度已达到了O(n²),而我们的的元素个数在0-105之间,那么也就是说,在最坏的情况(个数达到上限,且循环需要进行到底的情况)下,我们所需要的时间是1010。这肯定会超出预期时间。所以得降一降时间消耗。😢😢😢
做法二——递归
1.思想
1.我们同样假设要在第j天的时候卖出,而且设前j天的最小值为dp[j],那么dp[j]该如何计算?因为dp[j]表达的是股票的最低值,那么他也就相当于前j-1天的股票最低值和当天股票最低值取最小值所得到的数值,那么表达式即为dp[j]=min(dp[j-1],price[j]).
2.在第一步解决成功后,我们需要算出最大利润值(当天的价格(price[j])-前j天的最小值(dp[j])。如何计算?那当然是——枚举一下啦。
2.代码
int min(int a,int b)//计算最小值函数
{
if(a<=b)
return a;
else
return b;
}
int max(int a,int b)//计算最大值函数
{
if(a>=b)
return a;
else
return b;
}
int maxProfit(int* prices, int pricesSize){
int dp[100000];
int maxValue=0;
dp[0]=prices[0];
for(int i=1;i<pricesSize;i++)//算出前j天中股票最低价格
dp[i]=min(dp[i-1],prices[i]);
for(int i=0;i<pricesSize;i++)//算出最大利润
{
maxValue=max(maxValue,prices[i]-dp[i]);
}
return maxValue;
}
我们看到这个算法中虽然也使用了两次循环,但是这两次循环为并列形式,也就是说时间复杂度降到了O(n),可!😊😍
总结
通过这个例子,我们进一步认识到递归所解决的问题又多了一项(解决前j项中的最大值)。希望可以给个支持!