c - Hackerrank 挑战超时

标签 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 个嵌套的 for 循环,它们总是进行 n * k 操作,因为您将数组旋转 k 次并且需要 n > 进行旋转的操作。

这相当于 O(n * k),因此在最坏情况输入上大约需要 10^10 次操作,这对于这项任务来说太多了。

请阅读this首先文章介绍如何计算算法的复杂度,因为它提供了非常有用的信息,并通过实际示例进行了解释。

现在,您必须重新考虑您的算法并获得更好的时间复杂度。我不会破坏你的解决方案,但我可以给你一个提示:认为你真的不需要将数组旋转 k1 单位,您可以仅以 k 单位执行一次。

希望这对您有所帮助,祝您顺利解决挑战! :)

关于c - Hackerrank 挑战超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40492230/

相关文章:

c - DestroyWindow() 是否从消息队列中删除窗口的消息?

C 跳过操作

algorithm - 置换函数调用

c - 在 ARM Cortex M0 uart 控制台使用 printf() 打印 float

java - 为什么 IdentityHashMap 使用线性探测来解决冲突

algorithm - 我们不能在未加权的图中通过 DFS(改进的 DFS)找到最短路径吗?如果不是,那为什么?

javascript - node.js 在一定时间后发出事件

http - IIS中如何调整请求队列超时

python-3.x - 使用 os.system 函数时设置超时

无法使用链接列表添加两个数字