降低代码时间复杂度的一种思路

通过这个案例我来向大家演示,如何通过思路的转换来降低代码的时间复杂度。

例如:2022年蓝桥杯省赛题目

 

对于这样典型的递推题目,我们第一时间想到的可能就是,嵌套循环。

也就是说,先用一层循环for(int i;i<+n;i++),然后循环体中加入语句来表示a1,a2,a3~

在使用一层嵌套循环,在循环体找那个加入语句来表示a1+a2+a3~。

这样的代码,从逻辑上看,好像没有任何问题,考虑到了所有情况,而且能精准计算出结果,那是不是这样就行了呢?

Of course not.

当然不是。

我们粗略算一算,题目中给定的n<=200000,a<=1000,如果按照上面的思路来做,时间复杂度大致为200000*200000,10的10次方,这样的计算量是相当大的,所以,你的编译器大概会出现这种情况:

始终处于运行状态,但就是没有出现运行结果。

     所以,我们必须采取一些方法来降低时间复杂度。

继续来看,对于 a1+a2+a3~+an;我们并不一定要使用循环,而是可以采用下面这种结构。

定义一个长度为n的数组k,并且赋初值k=0;

 

 这样子的话,如果我们需要求Am~An项和,那么只需要求Km-K(n-1),比如:a2+a3=k3-k1。

有了这个思路我们再来编写代码:

这样子的话,代码的时间复杂度就远远降低了。

你学废了吗?

(此方法来源于B站up主-Paren,作者厚着脸借用一下)

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星光坠落残阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值