通过这个案例我来向大家演示,如何通过思路的转换来降低代码的时间复杂度。
例如: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,作者厚着脸借用一下)