这解决了特定的编程问题"来自On-Topic
我正在处理来自Amazon Software Interview的面试问题 问题是"给定一个整数三角形,找到最大总和的路径而不跳过。 "
我的问题是你如何表示整数三角形?
我在Triangle of Integers 看了一遍,发现整数的三角形看起来像是
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
表示此类内容的最佳方式(数据结构)是什么?我的想法是有类似
的东西int[] r1 = {1};
int[] r2 = {2, 3};
int[] r3 = {4, 5, 6};
int[] r4 = {7, 8, 9, 10};
int[] r5 = {11, 12, 13, 14, 15};
这是表示此三角形整数结构的最佳方式吗?我想过使用二维矩阵结构,但那些必须有相同大小的数组。
答案 0 :(得分:2)
您应该将它们放在线性内存中并以下列方式访问它们:
int triangular(int row){
return row * (row + 1) / 2 + 1;
}
int[] r = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
for(int i=0; i<n_rows; i++){
for(int j=0; j<=i; j++){
System.out.print(r[triangular(i)+j]+" ");
}System.out.println("");
}
row, column
if row>column:
index=triangular(row)+column
由于它是一个可预测的结构,因此每行开头的偏移量都有一个表达式。这将是最有效的方式。
答案 1 :(得分:2)
我考虑使用二维矩阵结构,但那些必须具有相同大小的数组。
不正确。
在Java中,您可以使用数组来表示非矩形数据结构; e.g。
int[][] triangle = {{1},
{2, 3},
{4, 5, 6},
{7, 8, 9, 10},
{11, 12, 13, 14, 15}};
这是一个选项,但不一定是最方便的选择。
答案 2 :(得分:1)
我使用带防护带的2D阵列。在下面的示例中,0表示数组中的无效条目。顶部和底部行以及最左侧和最右侧的列是保护带。优点是您的寻路算法可以在数组周围漫游而无需不断检查越界数组索引。
int[][] array =
{
{ 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 0 },
{ 0, 2, 3, 0, 0, 0, 0 },
{ 0, 4, 5, 6, 0, 0, 0 },
{ 0, 7, 8, 9,10, 0, 0 },
{ 0,11,12,13,14,15, 0 },
{ 0, 0, 0, 0, 0, 0, 0 }
};
答案 3 :(得分:0)
您根本不需要代表它!行r
的起始编号(从0开始)由表达式:
r * (r + 1) / 2 + 1