1339. Maximum Product of Splitted Binary Tree

LeetCode medium original: C# #csharp #leetcode #math #medium #tree #two-pointers
Il testo del problema è tradotto dal russo per la lingua selezionata. Il codice resta invariato.

given корневое albero. Разделите бинарное albero на два поддерева, удалив одно edge так, чтобы произведение сумм поддеревьев было максимальным.

return максимальное произведение сумм двух поддеревьев. Поскольку ответ может быть слишком большим, return его по модулю 10^9 + 7.

Обратите внимание, что вам нужно максимально увеличить ответ до взятия модуля, а не после.

Esempio:

Input: root = [1,2,3,4,5,6]

Output: 110

Explanation: Remove the red edge and get 2 binary trees with sum 11 and 10. Their product is 110 (11*10)

C# soluzione

abbinato/originale
public class Solution {
    private List<int> allSums = new List<int>();
    
    public int MaxProduct(TreeNode root) {
        long totalSum = TreeSum(root);
        long best = 0;
        foreach (long sum in allSums) {
            best = Math.Max(best, sum * (totalSum - sum));
        }
        return (int)(best % 1000000007);
    }
    private int TreeSum(TreeNode subroot) {
        if (subroot == null) return 0;
        int leftSum = TreeSum(subroot.left);
        int rightSum = TreeSum(subroot.right);
        int totalSum = leftSum + rightSum + subroot.val;
        allSums.Add(totalSum);
        return totalSum;
    }
}

C++ soluzione

bozza automatica, rivedere prima dell'invio
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    private List<int> allSums = new List<int>();
    
    public int MaxProduct(TreeNode root) {
        long totalSum = TreeSum(root);
        long best = 0;
        foreach (long sum in allSums) {
            best = max(best, sum * (totalSum - sum));
        }
        return (int)(best % 1000000007);
    }
    private int TreeSum(TreeNode subroot) {
        if (subroot == null) return 0;
        int leftSum = TreeSum(subroot.left);
        int rightSum = TreeSum(subroot.right);
        int totalSum = leftSum + rightSum + subroot.val;
        allSums.push_back(totalSum);
        return totalSum;
    }
}

Java soluzione

abbinato/originale
class Solution {

    private List<Integer> allSums = new ArrayList<>();

    public int maxProduct(TreeNode root) {
        long totalSum = treeSum(root);
        long best = 0;
        for (long sum : allSums) {
            best = Math.max(best, sum * (totalSum - sum));
        }
        return (int)(best % 1000000007);
    }

    private int treeSum(TreeNode subroot) {
        if (subroot == null) return 0;
        int leftSum = treeSum(subroot.left);
        int rightSum = treeSum(subroot.right);
        int totalSum = leftSum + rightSum + subroot.val;
        allSums.add(totalSum);
        return totalSum;
    }
}

Python soluzione

abbinato/originale
class Solution:
    def __init__(self):
        self.all_sums = []

    def maxProduct(self, root):
        total_sum = self.treeSum(root)
        best = 0
        for s in self.all_sums:
            best = max(best, s * (total_sum - s))
        return best % 1000000007

    def treeSum(self, subroot):
        if not subroot:
            return 0
        left_sum = self.treeSum(subroot.left)
        right_sum = self.treeSum(subroot.right)
        total_sum = left_sum + right_sum + subroot.val
        self.all_sums.append(total_sum)
        return total_sum

Go soluzione

abbinato/originale
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

type Solution struct {
    allSums []int
}

func (s *Solution) MaxProduct(root *TreeNode) int {
    totalSum := s.treeSum(root)
    var best int64 = 0
    for _, sum := range s.allSums {
        best = max(best, int64(sum)*(int64(totalSum)-int64(sum)))
    }
    return int(best % 1000000007)
}

func (s *Solution) treeSum(subroot *TreeNode) int {
    if subroot == nil {
        return 0
    }
    leftSum := s.treeSum(subroot.Left)
    rightSum := s.treeSum(subroot.Right)
    totalSum := leftSum + rightSum + subroot.Val
    s.allSums = append(s.allSums, totalSum)
    return totalSum
}

func max(a, b int64) int64 {
    if a > b {
        return a
    }
    return b
}

Algorithm

Рассчитать сумму значений всех узлов дерева и сохранить суммы всех поддеревьев в списке.

Перебрать все сохраненные суммы поддеревьев и для каждой вычислить произведение суммы поддерева и разности между общей суммой дерева и данной суммой поддерева.

find максимальное произведение среди всех вычисленных и вернуть его значение по модулю 10^9 + 7.

😎

Vacancies for this task

offerte attive with overlapping task tags are mostrati.

Tutte le offerte
Non ci sono ancora offerte attive.