学—力扣题之股票最佳时机(不含冷冻期)

书接上回

你买股票吗?想知道怎么计算最佳购买时机吗,那么就来看下面这道题吧!!!


题目

题目链接: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项中的最大值)。希望可以给个支持!

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值