Skip to content

Commit 82a1e5f

Browse files
committed
Added Number of Ways to Reorder Array to Get Same BST.java
1 parent 5ff5951 commit 82a1e5f

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
3+
private static final long MOD = 1000_000_007;
4+
5+
public int numOfWays(int[] nums) {
6+
int n = nums.length;
7+
long[][] dp = new long[n][n];
8+
for (int i = 0; i < n; i++) {
9+
dp[i][0] = dp[i][i] = 1;
10+
}
11+
for (int i = 2; i < n; i++) {
12+
for (int j = 1; j < i; j++) {
13+
dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j]) % MOD;
14+
}
15+
}
16+
List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());
17+
return (int) ((dfs(list, dp) - 1) % MOD);
18+
}
19+
20+
private long dfs(List<Integer> nums, long[][] dp) {
21+
int n = nums.size();
22+
if (n < 3) {
23+
return 1;
24+
}
25+
List<Integer> leftNodes = new ArrayList<>();
26+
List<Integer> rightNodes = new ArrayList<>();
27+
for (int i = 1; i < n; i++) {
28+
if (nums.get(i) < nums.get(0)) {
29+
leftNodes.add(nums.get(i));
30+
} else {
31+
rightNodes.add(nums.get(i));
32+
}
33+
}
34+
long leftCount = dfs(leftNodes, dp) % MOD;
35+
long rightCount = dfs(rightNodes, dp) % MOD;
36+
return (((leftCount * rightCount) % MOD) * dp[n - 1][leftNodes.size()]) % MOD;
37+
}
38+
}

0 commit comments

Comments
 (0)