这是我的代码:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
int main(){
int n, k, q;
scanf("%d %d %d",&n,&k,&q);
int qs[q];
int a[n];
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
for(int i = 0; i < q; i++){
scanf("%d",&qs[i]);
}
int lastNbr = a[n-1];
for(int i = 0; i < k; i++){
lastNbr = a[n-1];
for(int j = n - 1; j > -1; j--){
a[j] = (j-1 >= 0) ? a[j-1] : lastNbr;
}
}
for(int i = 0; i < q; i++){
printf("%d\n", a[qs[i]]);
}
return 0;
}
答案 0 :(得分:1)
好的,我们先来分析一下算法的时间复杂度:
你有2个嵌套的for循环,它总是用于k
次操作,因为你将数组旋转n
次并需要O(n * k)
个操作来进行旋转。
这与10^10
相同,因此关于最坏情况输入的k
操作,这对于此任务来说太过分了。
请先阅读extract()
文章,了解如何计算算法的复杂性,因为它提供了非常有用的信息,并通过实际示例进行了解释。
现在,您必须重新考虑算法并获得更好的时间复杂度。我不会破坏你的解决方案,但我可以给你一个提示:认为你真的不需要1
单位轮换你的阵列k
次,你可以而是只以{{1}}个单位执行一次。
希望这会有所帮助,祝你好运解决挑战! :)
答案 1 :(得分:0)
如果你看一下你的代码就是o(n * k)解决方案。你可以在o(n)时间内解决它。输入大小是10 pow 5,这就是为什么你有时间错误的原因。 %会帮助你。