【发布时间】:2015-01-02 21:20:30
【问题描述】:
我需要计算二维数组中可能的最大和,但代码必须在 O(n) 的效率内。 n 是数组中的数字个数。
数组就像楼梯,用户只需要输入N个数字。我们不需要检查它是否是一个有效的数字。
数字将显示在数组中,如下所示:
1
2 3
4 5 6
7 8 9 10
每一行还有一个数字。
您需要从第一行或最后一行开始获得最大的总和路径。 在每次迭代中,您只能向下移动一步,或沿对角线向下和向左/向下和向右移动一步。
也就是说,如果你从第一行开始,你可以去 2 或 3。假设你去 2;现在你只能去 4 或 5。如果你选择 5,你可以只去 7、8 或 9。或者如果你愿意,你可以去 1 > 3 > 6 > 8。但你不能去 1 > 2 > 6 > 10,因为 2 与 6 无关。
您也可以连续选择一个数字。你不能去 1 > 2 > 3 > 6 > 8 > 9 > 10 或类似的东西。
我们也可以更改单元格的值,但路径必须相同。这意味着我可以将例如 9 更改为 50,但这不会很好,因为它在原始数组中不是一个好的路径。 (这个数组中的最大和路径 1 > 3 > 6 > 10,所以我不能去不同的单元格)
我的问题是我需要这段代码以 O(n) 的效率运行。
我试图从最后一行开始检查它可以走的每条有效路径,我试图在每一种可能性中寻找最大的数字。第一个不是 O(n) 效率,第二个可能会得到错误的答案。
我也尝试从第一行开始,并扫描和比较所有步骤,但这又不是 O(n) 效率。
只是为了确保,我没有要求任何人为我编写代码,只是为了帮助我找出计算它的最佳方法。
顺便说一句,看到几个 cmets 并想在最后添加,我需要打印最大路径总和,而不是路径本身。
【问题讨论】:
-
乍一看,这似乎是一个练习,您将在其中构建路径树。树的每个节点是到达该节点的总和。最后,您将拥有终端节点,然后您将使用这些节点来查看每个路径的总和。
-
不清楚为什么 9 > 50 不是一条好路径。请将其编辑到您的问题中。
-
@NathanTuggy,我认为 9 到 50 与更改单元格值而不是路径有关。任何单元格值更改都必须使得它们不会通过使包含已更改单元格的路径的总和高于原始最高总和路径来改变最高总和路径。所以我想一个人可能会遍历矩阵并为矩阵的每个元素添加一些值。不知道为什么要更改单元格值,除非此约束是为了防止有人使用矩阵元素来保存路径总和?
-
对,但已发布的更改单元格值的限制包括“好路径”。这令人困惑。
-
Richard - 我认为你是对的,我尝试从上到下进行,但不是 O(n)。需要找出一种方法来处理它到 O(n)。 Nathan - 感谢您的编辑建议。我又写了一遍。希望现在它很好。刚刚看到richads 的评论——他是对的,我就是这个意思。
标签: java arrays algorithm multidimensional-array