Hackerrank挑战timout

时间:2016-11-08 16:45:46

标签: c algorithm timeout

嘿,我只是想解决对hackerrank的挑战,但在一些测试用例中代码超时,我不知道为什么。 This is the challenge

这是我的代码:

#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;
}

2 个答案:

答案 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,这就是为什么你有时间错误的原因。 %会帮助你。