我有一个编号元素 1 到 N 的列表,它们适合从 1 开始的数轴上的位置。我也对这些元素有限制:
- 元素 1 位于位置 1,元素 N 必须位于 >= 元素 N-1 的位置。(即元素 2 可能在位置 1,元素 3 在位置 7,元素 4 在位置 8(但不是位置 5))
- 某些元素必须在一定距离内才能在线。
- 某些元素必须至少与其他元素保持一定距离就行了。
我的目标是返回一个整数,表示元素 1 和元素 N 之间的最大跨度。如果没有可能的阵容,则返回 -1,如果元素可以相隔任意距离,则返回 -2。
我得到:
- 元素数量
- 一个 withinArray[][] 其中 withinArray[x][y] = 距离元素 x 和 y 必须在行内。任何零值表示没有约束。
- 一个 atLeastArray[][] 其中 atLeastArray[x][y] = 距离元素 x 和 y 必须在线上分开。任何零值表示没有约束。
一个示例输入是:4 个元素,withinArray[1][3] = 10、withinArray[2][4] = 20 和 atLeastArray[2][3] = 3。(所有其他数组值为零)。
此输入的返回值为 27。(元素 1 位于位置 1,元素 2 位于位置 8,元素 3 位于位置 11,元素 4 位于位置 28)
到目前为止,我想出了这个:
for (int i = 1; i < n; i++) {
for (int j = 1; j < atLeastArray.length; j++)
if (j == i)
positions[i] = positions[j] - atLeastArray[i][j];
for (int j = 1l j < withinArray.length; j++)
if (j == i)
positions[j] = positions[i] + withinArray[i][j];
}
return positions[n] - positions[1];
这为我给出的示例提供了正确的答案,但我不相信它在每种情况下都有效,而且我不确定如何定义不可能的情况或元素是否可以相距任何距离。