Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit acb19b6

Browse files
Create UniqueBinarySearchTrees.js (ignacio-chiazzo#21)
1 parent 2629f23 commit acb19b6

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
2+
/*
3+
https://leetcode.com/problems/unique-binary-search-trees/description/
4+
5+
96. Unique Binary Search Trees
6+
7+
Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n?
8+
9+
Example:
10+
11+
Input: 3
12+
Output: 5
13+
Explanation:
14+
Given n = 3, there are a total of 5 unique BST's:
15+
16+
1 3 3 2 1
17+
\ / / / \ \
18+
3 2 1 1 3 2
19+
/ / \ \
20+
2 1 2 3
21+
22+
23+
DP Solution: https://www.programcreek.com/2014/05/leetcode-unique-binary-search-trees-java/
24+
*/
25+
26+
// Solution 3 using DP
27+
var numTrees3 = function (n) {
28+
if (n == 0)
29+
return 0
30+
31+
var map = [];
32+
map[0] = 1;
33+
map[1] = 1;
34+
35+
for(var i = 2; i <= n; i++) {
36+
var currentI = 0;
37+
for(var j = 0; j < i; j++) {
38+
currentI += map[j] * map[i - j - 1];
39+
}
40+
map[i] = currentI;
41+
}
42+
43+
return map[n];
44+
}
45+
46+
// Solution 2 (Solution 1 + Memoization)
47+
var numTrees2 = function(n) {
48+
var memo = {};
49+
return numTreesAux2(1, n, memo);
50+
};
51+
52+
var numTreesAux2 = function(leftMin, leftMax, memo) {
53+
const keyMemo = buildKey(leftMin, leftMax);
54+
if(memo[keyMemo]) {
55+
return memo[keyMemo]
56+
}
57+
58+
if(leftMin > leftMax)
59+
return 0;
60+
61+
if(leftMin === leftMax)
62+
return 1;
63+
64+
var count = 0;
65+
for(var i = leftMin; i <= leftMax; i++){
66+
const left = numTreesAux2(leftMin, i - 1, memo);
67+
const right = numTreesAux2(i + 1, leftMax, memo);
68+
69+
if(left > 0 && right > 0) {
70+
count += left * right;
71+
} else {
72+
count += (left > 0) ? left : right;
73+
}
74+
}
75+
76+
memo[keyMemo] = count;
77+
return count;
78+
}
79+
80+
var buildKey = function(a, b) {
81+
return a + "-" + b;
82+
}
83+
84+
85+
// Solution 1
86+
var numTrees1 = function(n) {
87+
return numTreesAux1(1, n);
88+
};
89+
90+
var numTreesAux1 = function(leftMin, leftMax) {
91+
if(leftMin > leftMax)
92+
return 0;
93+
94+
if(leftMin === leftMax)
95+
return 1;
96+
97+
var count = 0;
98+
for(var i = leftMin; i <= leftMax; i++){
99+
const left = numTreesAux1(leftMin, i - 1);
100+
const right = numTreesAux1(i + 1, leftMax);
101+
102+
if(left > 0 && right > 0) {
103+
count += left * right;
104+
} else {
105+
count += (left > 0) ? left : right;
106+
}
107+
}
108+
109+
return count;
110+
}
111+
112+
var main = function() {
113+
console.log(numTrees1(1));
114+
console.log(numTrees1(2));
115+
console.log(numTrees1(3));
116+
console.log(numTrees1(5));
117+
118+
console.log(numTrees2(1));
119+
console.log(numTrees2(2));
120+
console.log(numTrees2(3));
121+
console.log(numTrees2(5));
122+
123+
console.log(numTrees3(1));
124+
console.log(numTrees3(2));
125+
console.log(numTrees3(3));
126+
console.log(numTrees3(5));
127+
}
128+
129+
main();
130+
131+
module.exports.main = main

0 commit comments

Comments
 (0)