在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
这个技巧是很多高效算法的基础,如排序算法(快速排序、归并排序)、傅立叶变换(快速傅立叶变换)。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
TreeNode dfs(int[] nums,int l,int r){
if(l>r){
return null;
}
int maxidx=l;
for(int i=l+1;i<=r;++i){
if(nums[i]>nums[maxidx]){
maxidx=i;
}
}
TreeNode root = new TreeNode(nums[maxidx]);
root.left = dfs(nums,l,maxidx-1);
root.right = dfs(nums,maxidx+1,r);
return root;
}
public TreeNode constructMaximumBinaryTree(int[] nums) {
TreeNode root = dfs(nums,0,nums.length-1);
return root;
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
TreeNode dfs(int[] preorder,int[] postorder,int prel, int prer,int postl, int postr){
System.out.printf("%d %d %d %d\n",prel,prer,postl,postr);
if(prel>prer){
return null;
}
TreeNode now = new TreeNode(preorder[prel]);
if(prel == prer){
return now;
}
int idx = m.get(preorder[prel+1]),len=idx-postl+1;
now.left=dfs(preorder,postorder,prel+1,prel+len,postl,idx);
now.right=dfs(preorder,postorder,prel+len+1,prer,idx+1,postr-1);
return now;
}
Map<Integer,Integer> m = new HashMap();
public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {
for(int i=0;i<postorder.length;i++){
m.put(postorder[i],i);
}
return dfs(preorder,postorder,0,preorder.length-1,0,postorder.length-1);
}
}
class Solution {
int maxn = 1010;
long[][] c = new long[maxn][maxn];
long mod = 1000000007;
TreeNode insert(TreeNode root,int val){
if(root==null){
return new TreeNode(val);
}
if(val<root.val){
root.left = insert(root.left,val);
} else if(val>root.val){
root.right = insert(root.right,val);
}
return root;
}
int count(TreeNode root){
if(root == null){
return 0;
}
return count(root.left)+count(root.right)+1;
}
long dfs(TreeNode root){
if(root == null){
return 1;
}
long ans = dfs(root.left)*dfs(root.right)%mod;
int leftc = count(root.left);
int rightc = count(root.right);
int totalc = leftc+rightc;
ans *= c[totalc][leftc];
ans %= mod;
return ans;
}
public int numOfWays(int[] nums) {
int i,j;
int n = nums.length;
for(i=0;i<=n;i++){
for(j=0;j<=i;++j){
if(j==0||j==i){
c[i][j]=1;
}
else{
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
}
TreeNode root=null;
for(i=0;i<nums.length;++i){
root=insert(root,nums[i]);
}
return (int)(dfs(root))-1;
}
}