【问题标题】:Finding the biggest value in 2D array找到二维数组中的最大值
【发布时间】:2021-02-18 03:24:34
【问题描述】:

给定二维数组

2 1 5 2 7
2 4 5 1 2
9 2 4 1 0
6 5 4 3 2

需要找到最大和的值。 我们可以从第一行开始,然后按方向移动:左下、下或右下 在本例中为:5 - 4 - 9 - 6 = 24 我有一个想法,将这个数组转换为具有 3 个“孩子”(左、下和右)的树。 并使用这棵树,假设第一行中的每个元素都是不同树的根,计算所有分支的总和。 也许,有一些其他的建议或解决方案,因为我无法让它发挥作用。 以下是查找所有分支总和的代码:

def branchHelper(root, sums=None, branchSum=0):
if root is None:
    return

if sums is None:
    sums = []

branchSum += root.value
if root.left is None and root.right is None and root.middle is None:
    sums.append(branchSum)
branchHelper(root.left, sums, branchSum)
branchHelper(root.middle, sums, branchSum)
branchHelper(root.right, sums, branchSum)
return sums

还有树代码:

class Tree:
def __init__(self, value, left=None, middle=None, right=None):
    self.value = value
    self.left = left
    self.middle = middle
    self.right = right

【问题讨论】:

    标签: python algorithm multidimensional-array


    【解决方案1】:

    这是动态程序的经典问题。您不需要将数组转换为树,只需遍历它即可。这样写起来更快更容易。您所要做的就是为每个数组元素计算在以该元素结尾的路径中可以收集多少。在第一行 - 你别无选择,只有一条路。然后,在第 k 行 - 您知道您只能从第 (k-1) 行中的 3 个数组字段之一来到这里,并且您确切地知道来自哪个。只选择最好的:)

    【讨论】:

    • 我还没有完全明白如何制作真正的代码,你能写出至少一部分吗?
    • 您遍历行,并且对于每个元素,您将其替换为该元素和上面元素的最大值之和(树中上面的元素,即上面的一行)。 2 1 5 2 74 9 10 8 918 12 14 11 924 23 18 17 13
    • 尝试在纸上模拟它,这样您就可以理解算法然后编写代码会很容易:) 在您的示例中,第二行:第一列 [2, 1] - 我可以来自这里[1, 1] 或 [1, 2] - 我选择 [1, 1] 因为 2>1。 [2, 1] 的答案是 2(来自前几行)+ 2(来自该字段)。然后第二列,字段 [2, 2] - 可能来自 [1, 1] 或 [1, 2] 或 [1, 3]。选择 [1, 3]。总值为 5+4。
    • 非常感谢。我会在这类任务中多练习..
    【解决方案2】:

    正确答案是上面那个。此外,我附上代码,以便您可以遵循。

    arr = [[2, 1, 5, 2, 7],
           [2, 4, 5, 1, 2],
           [9, 2, 4, 1, 0],
           [6, 5, 4, 3, 2]]
    
    def get_max_parent(index, previous_row):
        left_parent = index - 1 if index > 0 else 0
        right_parent = index + 1 if index < len(previous_row) - 1 else len(previous_row) - 1
    
        return max(previous_row[left_parent], previous_row[index], previous_row[right_parent])
    
    def solve(l):
        current_row = arr[0]
        for row in arr[1:]:
            previous_row = current_row[:]
            for index, elem in enumerate(row):
                current_row[index] = row[index] + get_max_parent(index, previous_row)
    
        return max(current_row)
    
    if __name__ == '__main__':
        solve(arr)
    

    【讨论】:

    • 我已经自己搞定了,谢谢。你的版本也不错。
    猜你喜欢
    • 2017-04-03
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2019-03-31
    • 1970-01-01
    • 2017-04-24
    • 2018-09-25
    相关资源
    最近更新 更多