【问题标题】:Hackerrank challenge timout [closed]Hackerrank挑战超时[关闭]
【发布时间】:2017-03-22 09:26:21
【问题描述】:

嘿,我只是想解决关于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;
}

【问题讨论】:

  • 好吧,正如你所写:正在努力解决它。如果我们这样做,那将是不公平的...... - 您有具体的问题吗?
  • 秘密是你不需要旋转数组; % 运算符是你的朋友。
  • @Olaf 我的意思是当我提交代码时,大多数测试用例都在工作,但有些超时。如果您能给我提示超时发生在我的代码的哪一部分,那就太好了。 :)
  • 代码执行没有在规定的时间内完成,这是挑战的一部分。如果即使在测试用例上也超时,您需要认真重新考虑算法。
  • 如果你不能解决,那就是社论的原因。

标签: c algorithm timeout


【解决方案1】:

如果您查看您的代码,它是 o (n*k) 解决方案。您可以在 o (n) 时间内解决它。输入大小是 10 pow 5 这就是为什么你得到超时错误。 % 将在这里为您提供帮助。

【讨论】:

    【解决方案2】:

    好的,让我们从分析算法的时间复杂度开始:

    当您旋转数组k 次并且需要n 操作来进行旋转时,您有2 个嵌套的for 循环,它们总是用于n * k 操作。

    这是O(n * k),所以它是关于最坏情况输入的10^10操作,这对于这项任务来说太多了。

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

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

    希望这会有所帮助,祝你好运解决挑战! :)

    【讨论】:

    • 请注意,部分挑战是让 OP 在要求的时间内完成执行 - 如果他/她不能,那么他/她就失败了。如果我们为他/她回答,他们学到了什么(除了寻求帮助比自己学习更容易)
    • 我没有剧透解决方案,我只是给出了一个提示和一篇关于研究时间复杂度的文章。也许她/他还没有所有这些知识,也不知道从哪里开始学习。此外,如果您无法找出问题的解决方案,您会寻求提示,而不仅仅是花更多时间在上面。就我个人而言,我认为在一个问题上思考太久,即使你在 1-2 周后弄清楚了,这几乎是浪费时间。
    • @VladTarniceru 非常感谢您的帮助。是的,我是这个算法主题的新手,所以我在这方面的知识并不多,而且我刚刚开始学习 c。
    • @VladTarniceru 我花了 1-2 周的时间来解决一些困难的挑战问题。有些我解决了,有些我没有。在此过程中,我获得了对该主题的深入了解。这属于“娱乐”的标题,所以我认为这没有浪费时间:就像失去渔获的渔夫一样,这完全是关于“在那里”的乐趣,以及制作的希望那个抓。
    • @WeatherVane 我在一个问题上花费的最长时间是 2 个月。是的,我同意,在一个问题上思考更长的时间肯定很有趣,但有时你必须知道何时说“停止,我会寻求提示”。大多数人实际上没有两周的时间来解决一个问题,因为整个过程太慢了。我在 13 岁的时候一直在世界上,开始学习算法,但现在,如果我最多 3 小时内无法找出问题的解决方案,我会看一下解决方案。只是我没有那么多时间,我想涵盖大多数主题。