[英]How do you break an array in to little arrays of a fixed size? (in C)
我試圖在Hacker Rank中做一個練習,但是發現我的代碼(下面)過於線性。 為了使它更好,我想知道是否有可能將一個數組分解成固定大小的小數組以完成此練習。
#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項陣列。
問題不在線性解決方案中。 主要問題在於算法的復雜性。 就像寫的那樣,它是O(N ^ 4)。 我也認為您的解決方案是不正確的,因為:
墓塔可以覆蓋Y行和X列的矩形區域。
這並不完全意味着Y行和X列恕我直言,您可以找到are維度小於X,Y的解決方案。
這樣的問題可以使用動態編程在合理的時間內解決。 嘗試使用對O(N ^ 2)的動態編程來優化程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.