如何将数组分解为固定大小的小数组? (在C中)
问题描述:
我试图在Hacker Rank中做一个练习,但发现我的代码(下面)太线性了。为了使它更好,我想知道是否有可能将数组分解为固定大小的小数组来完成此练习。如何将数组分解为固定大小的小数组? (在C中)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
int N, M, Y, X;
scanf("%d %d %d %d", &N, &M, &Y, &X);
int max = 0;
int total = 0;
int data[N][M];
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; j++)
{
scanf("%d",&(data[i][j]));
}
}
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; j++)
{
total = 0;
for(int l = 0; (l < Y) && (i + Y) <= N; l++)
{
for(int k = 0; (k < X) && (j + X <= M); k++)
{
total += data[i+l][j+k];
}
if(total > max)
max = total;
}
}
}
printf("%d",max);
return 0;
}
答
尽管“破”成块意味着我们会被在内存中移动的东西,你可以去“观察”这样的数组,它是等价的。
在一个非常真实的意义上,数组的名称只是一个指向第一个元素的指针。当您取消引用数组的元素时,将使用数组映射函数来执行指针运算,以便可以找到正确的元素。这是必要的,因为C数组本身并没有任何指针信息来识别元素。
然而,如何将数组存储的本质用于将数据视为任意大小的任意数组。例如,如果我们有:
int integers[] = {1,2,3,4,5,6,7,8,9,10};
,你可以认为这是一个数组:
for(i=0;i!=10;i++){ printf("%d\n", integers[i]); }
但上述阵列也可以做到这一点出发:
int *iArray1, *iArray2;
iArray1 = integers;
iArray2 = integers + (5 * sizeof(int));
for(i=0;i!=5;i++){ printf("%d - %d\n", iArray1[i], iArray2[i]);}
这样我们选择查看数据为两个5 t erm数组。
答
该问题不在线性解决方案中。主要问题在于算法的复杂性。因为它写的是O(N^4)。此外,我认为你的解决方案是不正确的,因为:
ceulluar塔可以覆盖Y行X列Regtangular区域。
这并不意味着什么y行和X列恕我直言,你能找到一个解决方案,其中的尺寸小于X,Y
的问题,例如,使用动态规划是在合理的时间内可解。尝试使用动态编程优化您的程序到O(N^2)。