Leetcode 95. Unique Binary Search Trees II
unique한 binary tree를 어떻게 만들지 ? ... 라고 생각하면.
dp(start, end) = for all i in [start, end], dp[start, i-1] + dp[i+1, end]
로 풀면 된다.
이게 무슨 말이냐?
start ~ end 사이에 있는 어떤 i를 root로 두고, 그 start ~ i-1은 왼쪽 subtree에, i+1 ~ right는 오른쪽 subtree에 넣는 DP라는 말이다.
그러면, left subtree와 right subtree의 cartesian product하면 모든 가능한 결과가 나온다.
// Runtime 16 ms Beats 75.53%
// Memory 16.1 MB Beats 56.82%
class Solution {
public:
vector<TreeNode*> build(int start, int end){
vector<TreeNode*> result;
if(start > end){
result.push_back(NULL);
return result;
}
for(int i = start; i<=end; i++){
vector<TreeNode*> left = build(start, i-1);
vector<TreeNode*> right = build(i+1, end);
for(int j = 0; j<left.size(); j++){
for(int k = 0; k<right.size(); k++){
TreeNode* parent = new TreeNode(i);
parent->left = left[j];
parent->right = right[k];
result.push_back(parent);
}
}
}
return result;
}
vector<TreeNode*> generateTrees(int n) {
return build(1, n);
}
};
'PS > PS Log' 카테고리의 다른 글
23.08.08. 풀었던 문제들 복기 (1) | 2023.08.09 |
---|---|
23.08.07. 풀었던 문제들 복기 (0) | 2023.08.09 |
23.08.04. 풀었던 문제들 복기 (0) | 2023.08.05 |
23.08.02. 풀었던 문제들 복기 (0) | 2023.08.02 |
23.08.01. 풀었던 문제들 복기 (0) | 2023.08.01 |