题目
https://www.lintcode.com/problem/1403
一棵有 n 个结点,根结点为 1 的二叉树,每条边通过两个顶点x[i],y[i]来描述,每个点的权值通过d[i]来描述。
求从根结点到叶子结点路径上所有结点权值乘积对1e9+7取模后最大的路径的值。
2 <= n <= 10^5
-10^5 <= d[i] <= 10^5
1 <= x[i], y[i] <= n
样例
样例 1:
输入:x = [1], y = [2], d = [1,1]
输出:1。
解释:最大乘积路径:1->2。(1 * 1) % (1e9+7) = 1
样例 2:
输入: x =[1,2,2], y = [2,3,4], d = [1,1,-1,2]
输出:1000000006。
解释:最大乘积路径:1->2->3。(1 * 1 * ( -1 )) % (1e9+7) = 1000000006
思路
简单来说就是以及其纠结的方式给你了一个binary tree,
然后要求出从根结点到叶子结点路径上所有结点权值乘积对1e9+7取模后。
因为树太深的情况下会溢出,所以每次乘积都要 [(product + mod) % mod]
答案
public class Solution {
/**
* @param x: The end points of edges set
* @param y: The end points of edges set
* @param d: The weight of points set
* @return: Return the maximum product
*/
public int getProduct(int[] x, int[] y, int[] d) {
/*
简单来说就是以及其纠结的方式给你了一个binary tree,
然后要求出从根结点到叶子结点路径上所有结点权值乘积对1e9+7取模后。
因为树太深的情况下会溢出,所以每次乘积都要 [(product + mod) % mod]
*/
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i <x.length ; i++) {
if(!map.containsKey(x[i]))
map.put(x[i],new ArrayList<>());
map.get(x[i]).add(y[i]);
}
Map<Integer,Integer> weight = new HashMap<>();
for (int i = 0; i <d.length ; i++) {
weight.put(i+1,d[i]);
}
int[] ans ={Integer.MIN_VALUE};
f(1,map,weight,d[0],ans);
return ans[0];
}
public static void f(int node,Map<Integer,List<Integer>> map,
Map<Integer,Integer> weight,long product,int[] ans){
if(!map.containsKey(node)){
ans[0] =(int)Math.max(ans[0],product);
return;
}
int mod = 1000000007;
for (Integer next : map.get(node)) {
f(next,map,weight,(product*weight.get(next)+mod)%mod,ans);
}
}
}