由于超时,C程序循环阵列旋转终止

时间:2016-11-03 03:14:54

标签: c arrays

所以我试图解决你执行k数组[n]旋转的黑客问题(C语言),并最后要求m和打印数组[m]。 我的程序可能是正确的(它在大多数测试中都运行良好,但有些因超时而终止),但效率低下,不知道如何改进它。

#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; 
    int k; 
    int q; 
    scanf("%d %d %d",&n,&k,&q);
    int *a = malloc(sizeof(int) * n);
    int *b = malloc(sizeof(int) * n);
    for(int a_i = 0; a_i < n; a_i++){
       scanf("%d",&a[a_i]);
    }
    for(int i = 0; i < k; i++){
        b[0] = a[n-1];
        for(int a_i = 1; a_i < n; a_i++){
        b[a_i] = a[a_i-1];
        }
        for(int a_i = 0; a_i < n; a_i++) a[a_i] = b[a_i];
    }
    for(int a0 = 0; a0 < q; a0++){
    int m; 
    scanf("%d",&m);
    printf("%d\n", b[m]);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

这看起来更像是一个算法问题。根据我的收集,您的计划:

  1. 读取大小 n ;
  2. 的数组
  3. 将数组 k 位置向右旋转;
  4. 从结果数组中输出 q 个位置。
  5. 复杂度为 O(kn + q),因为每个 k 旋转都是在线性时间内完成的。

    只需旋转一次即可执行第2步。将 a 中的最后 k 元素复制到 b 的开头,并将 nk 元素从 a复制到 b 的末尾。这降低了 O(n + q)的复杂性。

    您可以通过完全跳过第2步来进一步优化程序。在第3步中查找位置 m 时,只需查看 a [ k - m ](如果 k em>&lt; m )。这会降低 O(q)的复杂性。