[leetcode] 이 진 트 리 의 최대 곱 하기 (나무의 옮 겨 다 니 기)

이 진 트 리 한 그루 를 드 리 겠 습 니 다. 뿌리 는 루트 입 니 다.두 갈래 나 무 를 두 그루 의 나무 로 분열 시 키 고, 그것들의 나무 와 곱셈 은 가능 한 한 크다.
답 이 많 을 수 있 으 니 결 과 를 10 ^ 9 + 7 로 모드 를 취하 고 돌아 오 세 요.
예시 1:
입력: root = [1, 2, 3, 4, 5, 6] 출력: 110 해석: 빨간색 의 가장 자 리 를 삭제 하고 두 그루 의 나 무 를 얻 습 니 다. 각각 11 과 10 입 니 다.그것들의 곱셈 은 110 (11 * 10) 예시 2 이다.
입력: root = [1, null, 2, 3, 4, null, null, 5, 6] 출력: 90 설명: 빨간색 의 가장 자 리 를 제거 하고 두 그루 의 나 무 를 얻 습 니 다. 각각 15 와 6 입 니 다.그것들의 곱셈 은 90 (15 * 6) 예시 3:
입력: root = [2, 3, 9, 10, 7, 8, 6, 5, 4, 11, 1] 출력: 1025 예시 4:
입력: root = [1, 1] 출력: 1
알림:
나무 마다 최대 50000 개의 노드 가 있 고 적어도 2 개의 노드 가 있다.각 노드 의 값 은 [1, 10000] 사이 입 니 다.
링크:https://leetcode-cn.com/problems/maximum-product-of-splitted-binary-tree
사고 분석:
이 문제 의 주 된 점 은 바로 나무의 편력 이다.방법 은 모든 노드 를 옮 겨 다 니 는 것 입 니 다. ans 는 현재 트 리 의 합계 * 나머지 노드 의 합 계 를 위해 최대 치 를 가 져 옵 니 다.사실은먼저 차례 는 O (n ^ 2) 의 시간 복잡 도 이 고, 차례 는 O (n) 입 니 다.그냥 오 랜 만 에 나 무 를 만 나 서 글 씨 를 잘 못 써 요. 사실 어렵 지 않 은 것 같 아 요. 아니면... 쉬 워 요.아이고.
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

class Solution {
public:
    const int MOD = 1e9+7;
    long long sum = 0;
    long long ans = 0;

    long long getCount(TreeNode* rt)	//        
    {
        if(!rt) return 0;
        return rt->val + getCount(rt->left) + getCount(rt->right);
    }

    long long dfs(TreeNode* rt)	//          
    {
        if(!rt) return 0;
        long long tmp = rt->val + dfs(rt->left) + dfs(rt->right);
        ans = max(tmp*(sum-tmp), ans);
        return tmp;
    }

    int maxProduct(TreeNode* root) {
        sum = getCount(root);
        dfs(root);
        return ans%MOD;
    }
};

좋은 웹페이지 즐겨찾기