我正在为Hackerrank编写一个编程问题。 https://www.hackerrank.com/challenges/30-2d-arrays。我已经解决了这个问题,但是就像任何一个好的开发人员一样,我正在寻找有关为最快的代码执行创建二维数据结构的最佳实践的建议。
问题非常简单,并要求在二维数组中定义一个形状,并计算该形状所有出现的最高值。
因此,首先,我使用的是二维数组,而不是使用模板中提供的向量。但是,我有一些指针训练,所以我用这样的结构指针创建了一个2d数组:
提前致谢
#include <iostream>
using namespace std;
struct row {
signed int * usePointers;
};
int main() {
int highest = -324;
int next;
row* chart;
chart = new row[6]; //allocate all rows first
for (int arr_i = 0; arr_i < 6; arr_i++) {
chart[arr_i].usePointers = new int[6]; //allocate each column here
for (int arr_j = 0; arr_j < 6; arr_j++) {
chart[arr_i].usePointers[arr_j] = 0; //fill each element here
cin >> chart[arr_i].usePointers[arr_j];
}
}
//create the hourglass (n-3)*(n-3) times
for (int arr_i = 0; arr_i <=3; arr_i++) {
for (int arr_j = 0; arr_j <=3; arr_j++) {
next = 0;
//top
next += chart[arr_i].usePointers[arr_j] +
chart[arr_i].usePointers[arr_j+1] +
chart[arr_i].usePointers[arr_j+2];
//mid
next += chart[arr_i+1].usePointers[arr_j + 1];
//bottom
next += chart[arr_i+2].usePointers[arr_j] +
chart[arr_i+2].usePointers[arr_j + 1] +
chart[arr_i+2].usePointers[arr_j + 2];
if (next > highest)
highest = next;
//cout << chart[arr_i].usePointers[arr_j];
}
}
cout << highest;
free(chart);
return 0;
}
答案 0 :(得分:1)
如果您只需要一个固定大小的2D数组,那么您应该只使用像int a[6][8]
这样的东西并完成它。如果需要动态2D数组,通常将数组分配为一个连续的内存块然后执行自己访问数组元素所需的偏移计算会更有效。搞乱指针数组可能会很慢,因为数组将位于多个不同的内存区域,这将打败CPU缓存算法。