leetcode 95. Unique Binary Search Trees II(dp)
来源:互联网 发布:淘宝网历任总裁 编辑:程序博客网 时间:2024/06/08 13:46
题意:
给你n个结点,求所有不同形态的二叉搜索树(BST)。
思路:
枚举每个结点作为根节点时的BST,对于每个根节点,枚举所有不同形态的左子树和右子树,根据BST的定义,左子树和右子树必须也是BST,那么求不同形态子树时又可以用同样的方法,这就成了求解子问题(dp)题目。
由于这题给的数据是1~n的整数,所以当i为根节点时,左子树的值有小于i(即1~i-1),同理右子树为(i+1~n);
java代码:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public List<TreeNode> generateTrees(int n) { if(n<1){ return new ArrayList(); } return dfs(1,n); } public List<TreeNode> dfs(int s,int e){ if(s>e){ List<TreeNode> temp = new ArrayList(); temp.add(null); return temp; } List<TreeNode> ans = new ArrayList(); for(int i = s;i<=e;i++){ List<TreeNode> lList = dfs(s,i-1); List<TreeNode> rList = dfs(i+1,e); for(TreeNode left:lList){ for(TreeNode right:rList){ TreeNode root = new TreeNode(i); root.left = left; root.right = right; ans.add(root); } } } return ans; }}
如果用dfs来求解子问题,子问题并不能保存起来,某个子问题在递归过程会重复进行求解,这大大浪费时间(例如,求1~5的BST时1~4这个子问题求了以此,在求1~6的BST,1~4这个子问题又求了一次,同时1~5又重复求了一遍),所以可以开空间来节省时间,开一个二维数组(元素为链表)dp来保存每个子问题所有的BST形态。
//注意用":"方法访问时,只能访问List接口,不能直接访问ArrayList抽象类。
java代码:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public List<TreeNode> generateTrees(int n) { if(n<1){ return new ArrayList(); } List[][] dp = new List[n+2][n+2]; for(int i = 0;i<n+2;i++){ for(int j = 0;j<n+2;j++){ if(i==0){ dp[i][j] = new ArrayList(); dp[i][j].add(null); } else{ dp[i][j] = new ArrayList(); } } } for(int i = 1;i<=n;i++){ for(int j = 1;j<=n-i+1;j++){ for(int k = j;k<j+i;k++){ List<TreeNode> lList = dp[k-j][j]; List<TreeNode> rList = dp[j+i-1-k][k+1]; for(TreeNode left : lList){ for(TreeNode right : rList){ TreeNode temp = new TreeNode(k); temp.left = left; temp.right = right; dp[i][j].add(temp); } } } } } return dp[n][1]; }}
阅读全文
1 0
- leetcode 95. Unique Binary Search Trees II(dp)
- [LeetCode]95.Unique Binary Search Trees II
- [Leetcode] 95. Unique Binary Search Trees II
- LeetCode --- 95. Unique Binary Search Trees II
- [leetcode] 95.Unique Binary Search Trees II
- [leetcode] 95. Unique Binary Search Trees II
- 95. Unique Binary Search Trees II LeetCode
- ***LeetCode 95. Unique Binary Search Trees II
- Leetcode 95. Unique Binary Search Trees II
- LeetCode *** 95. Unique Binary Search Trees II
- 【LeetCode】95. Unique Binary Search Trees II
- LeetCode 95. Unique Binary Search Trees II
- [leetcode]95. Unique Binary Search Trees II
- [leetcode]95. Unique Binary Search Trees II
- [LeetCode] 95. Unique Binary Search Trees II
- LeetCode 95. Unique Binary Search Trees II
- [leetcode] 95. Unique Binary Search Trees II
- Leetcode-95. Unique Binary Search Trees II
- Java方法的隐藏与覆盖
- stm32_019_stm32Systick配置
- C语言实现龙贝格积分
- CentO安装jdk遇到的问题
- 堆及堆排序c++实现
- leetcode 95. Unique Binary Search Trees II(dp)
- 如何一求个整数的二进制数中1的个数
- 一系列整数中求最大者,输0结束
- angular 自定义过滤器
- Node IO 缓存区的作用
- SQL语句Limit的用法
- 数据结构实验之查找二:平衡二叉树
- 前端的一些基本概念
- Python中argparse模块学习