LeetCode 1130. Minimum Cost Tree From Leaf Values

LeetCode 1130

这个题目看起来挺复杂的,读懂这个题目还花了点时间。
给出的这个数组,是中序遍历后挑出所有叶子节点组成的一个数组。

1. 根据题目的要求,每个非叶子节点都有2个子节点。说明这棵树是满二叉树(Full Binary Tree),那么就有特性,如过有n个叶子节点,这棵树总是有n-1个非叶子节点。所以非叶子节点的个数是固定的。那么这个题目可以转换为想办法去找最小非叶子节点值的和问题。

2. 所有的非父节点都是左右子树中最大叶子节点的product。而给出的叶子节点是中序遍历的结果。我们只能使用相邻两个节点去找最小product,而这个结果可以当作一个非叶子节点来用。同时在两个节点中大的这个,作为下一轮的输入。可以重复这个方法一直找到所有的n-1个非叶子节点。

转为代码:

    def mctFromLeafValues(self, arr: List[int]) -> int:
        nl = len(arr)
        if nl <= 1: return 0

        miniIndex = 0
        product = sys.maxsize
        for i in range(nl-1):
            newp = arr[i] * arr[i+1]
            if  newp < product:
                product = newp
                if arr[i] < arr[i+1]:
                    miniIndex = i
                else:
                    miniIndex = i+1
        
        arr.pop(miniIndex)
        return product + self.mctFromLeafValues(arr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值