Open azl397985856 opened 1 year ago
class Solution {
//Leetcode 涂涂画画
// TC:O(n^2) SP: O(n)
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
}
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1);
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++)
{
for (int j = 0; j < i; j++)
{
dp[i] += dp[j] * dp[i - 1 - j];
}
}
return dp[n];
}
};
分治
class Solution:
visited = dict()
def numTrees(self, n: int) -> int:
if nin self. Visited:
return self.visited.get(n)
if n <= 1:
return 1
res = 0
for iin range(1, n + 1):
res += self.numTrees(i - 1) * self.numTrees(n - i)
self. Visited[n] = res
return res
**复杂度分析**
- 时间复杂度:O(N^2),。
- 空间复杂度:O(N)
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1, 0);
dp[0] = 1;
for (int i = 1; i <= n; ++i)
{
for (int j = 0; j < i; ++j)
{
dp[i] += dp[j] * dp[i - 1 - j];
}
}
return dp[n];
}
};
class Solution:
def numTrees(self, n: int) -> int:
dp = [1, 1]
for i in range(2, n + 1):
count = 0
for j in range(i):
count += dp[j] * dp[i - j - 1]
dp.append(count)
return dp.pop()
class Solution: visited = dict()
def numTrees(self, n: int) -> int:
if n in self.visited:
return self.visited.get(n)
if n <= 1:
return 1
res = 0
for i in range(1, n + 1):
res += self.numTrees(i - 1) * self.numTrees(n - i)
self.visited[n] = res
return res
class Solution:
def numTrees(self, n: int) -> int:
dp = [0] * (n + 1)
dp[0] = 1
dp[1] = 1
for i in range(2, n + 1):
# 枚举根节点的位置 j(其值在 1~i 之间)
for j in range(1, i + 1):
dp[i] += dp[j - 1] * dp[i - j]
return dp[-1]
# time: O(n ** 2)
# space: O(n)
class Solution {
public int numTrees(int n) {
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n; i++ ){
for(int j = 1; j <= i; j++){
dp[i] = dp[i] + dp[j-1] * dp[i-j];
}
}
return dp[n];
}
}
/**
* @param {number} n
* @return {number}
*/
var numTrees = function(n) {
//dp[i]:以 1...i为节点组成的搜索二叉树的数量
const dp = new Array(n + 1).fill(0);
//dp[i]=dp[j-1]*dp[i-j](j:遍历1-i)
dp[1] = 1;
dp[0] = 1;
for (let i = 2; i <= n; i++) {
for (let j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n]
};
TC: O(n^2)
SC: O(n^2)
private int[][] memo;
public int numTrees(int n) {
memo = new int[n + 1][n + 1];
return dfs(1, n);
}
private int dfs(int lo, int hi) {
if (lo > hi) return 1;
if (memo[lo][hi] != 0) return memo[lo][hi];
int res = 0;
for (int mid = lo; mid <= hi; mid++)
res += dfs(lo, mid - 1) * dfs(mid + 1, hi);
memo[lo][hi] = res;
return res;
}
数学方法
class Solution {
public:
int numTrees(int n) {
long long C = 1;
for (int i = 0; i < n; ++i) {
C = C * 2 * (2 * i + 1) / (i + 2);
}
return (int)C;
}
};
class Solution:
visited = dict()
def numTrees(self, n: int) -> int:
if n in self.visited:
return self.visited.get(n)
if n <= 1:
return 1
res = 0
for i in range(1, n + 1):
res += self.numTrees(i - 1) * self.numTrees(n - i)
self.visited[n] = res
return res
dp
public int NumTrees(int n)
{
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i < n + 1; i++)
for (int j = 1; j < i + 1; j++)
dp[i] += dp[j - 1] * dp[i - j];
return dp[n];
}
复杂度分析
class Solution {
public int numTrees(int n) {
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
for (int j = 0; j < i; j++) {
dp[i] += dp[j] * dp[i - j - 1];
}
}
return dp[n];
}
}
var numTrees = function (n) {
const dp = new Array(n+1).fill(0);
dp[0] = 1;
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= i; j++) {
dp[i] += dp[j-1]*dp[i-j]
}
}
return dp[n]
};
class Solution {
public:
int numTrees(int n) {
vector
class Solution:
def __init__(self):
self.dp = {}
def numTrees(self, n: int) -> int:
if n in self.dp:
return self.dp[n]
if n == 0 or n == 1:
return 1
result = 0
for i in range(1, n + 1):
result += self.numTrees(i - 1) * self.numTrees(n - i)
self.dp[n] = result
return result
Time: O(n) Space: O(n)
class Solution:
def numTrees(self, n: int) -> int:
C = 1
for i in range(0, n):
C = C * 2*(2*i+1)/(i+2)
return int(C)
"""
时间复杂度:o(n)
空间复杂度:O(1)
"""
class Solution:
visited = dict()
def numTrees(self, n: int) -> int:
if n in self.visited:
return self.visited.get(n)
if n <= 1:
return 1
res = 0
for i in range(1, n + 1):
res += self.numTrees(i - 1) * self.numTrees(n - i)
self.visited[n] = res
return res
class Solution {
public:
int numTrees(int n) {
int c=1;
for(int i=0;i<n;i++)
c = c * 2*(2*i+1)/(i+2);
return c;
}
};
分治
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1,0);
if(n==1) return 1;
if(n==2) return 2;
dp[0]=1;
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;i++){
for(int j=1;j<=i;j++){
dp[i]+=dp[j-1]*dp[i-j];
//cout<<"i="<<i<<" "<<dp[j-1]*dp[n-j]<<endl;
}
}
return dp[n];
}
};
复杂度分析 -待定
class Solution {
public int numTrees(int n) {
int[] G = new int[n + 1];
G[0] = 1;
G[1] = 1;
for(int i = 2; i<=n; i++){
for(int j = 1; j<=i; j++){
G[i] += G[j - 1] * G[i - j];
}
}
return G[n];
}
}
复杂度分析
递归,分治
时间复杂度:O(n^2) 空间复杂度:O(n)
class Solution:
@cache
def numTrees(self, n: int) -> int:
if n==0 or n==1:
return 1
s = 0
for i in range(1,n+1):
s += self.numTrees(i-1)*self.numTrees(n-i)
return s
Python3 Code:
class Solution:
visited = dict()
def numTrees(self, n: int) -> int:
if n in self.visited:
return self.visited.get(n)
if n <= 1:
return 1
res = 0
for i in range(1, n + 1):
res += self.numTrees(i - 1) * self.numTrees(n - i)
self.visited[n] = res
return res
复杂度分析
var findKthLargest = function (nums, k) {
let K = nums.length - k;
let start = 0, end = nums.length - 1;
while (start < end) {
let p = partition(nums, start, end);
if (p === K) {
return nums[p];
} else if (p < K) {
start = p + 1
} else {
end = p - 1;
}
}
return nums[start];
};
function partition(nums, start, end) {
let pivot = nums[start];
while (start < end) {
while (nums[end] >= pivot && start < end) {
end--;
};
nums[start] = nums[end];
while (nums[start] < pivot && start < end) {
start++;
}
nums[end] = nums[start];
}
nums[start] = pivot;
return start;
}
96. 不同的二叉搜索树
入选理由
暂无
题目地址
https://leetcode-cn.com/problems/unique-binary-search-trees/
前置知识
题目描述
示例:
输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3