动态规划动态规划

leetcode 96+ leetcode 95

2018-12-21  本文已影响0人  Ariana不会哭

leetcode 96

图片.png

计算唯一二叉搜索树的个数:用到catalan公式:


图片.png
                    1                        n = 1

                2        1                   n = 2
               /          \
              1            2
  
   1         3     3      2      1           n = 3
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

n = 0 时赋为1
dp[2] = dp[0] * dp[1]   (1为根的情况)

   + dp[1] * dp[0]   (2为根的情况)

同理可写出 n = 3 的计算方法:

dp[3] = dp[0] * dp[2]   (1为根的情况)

   + dp[1] * dp[1]   (2为根的情况)

   + dp[2] * dp[0]   (3为根的情况)

int numTrees(int n) {
        vector<int> dp(n+1,0);
        dp[0]=1;
        dp[1]=1;
        for(int i=2;i<n+1;i++){
            for(int j=0;j<i;j++){
                dp[i]+=dp[i-1-j]*dp[j];
            }
        }
        return dp[n];
    }
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=0;j<i;j++){
                dp[i]+=dp[i-1-j]*dp[j];
            }
        }
        return dp[n];
    
    }

leetcode 95

图片.png
1      1      2       3     3                  
 \     \     / \     /     /          
 2      3   1   3   2     1            
 \     /           /       \                 
 3     2          1         2   

代码:C++

vector<TreeNode*>* DFS(int start, int end) {
    vector<TreeNode*> *ans = new vector<TreeNode*>();
    if (start > end) {
        ans->push_back(NULL);
    }
    else {
        for (int i = start; i <= end; i++) {
            vector<TreeNode*> *leftAll = DFS(start, i - 1);
            vector<TreeNode*> *rightAll = DFS(i + 1, end);
            for (int j = 0; j < leftAll->size(); j++) {
                for (int k = 0; k < rightAll->size(); k++) {
                    TreeNode* nn = new TreeNode(i);
                    nn->left = (*leftAll)[j];
                    nn->right = (*rightAll)[k];
                    ans->push_back(nn);
                }
            }
        }
    }


    return ans;
}
vector<TreeNode*> generateTrees(int n) {
    if (n == 0)
        return {};
    return *DFS(1, n);
}
上一篇下一篇

猜你喜欢

热点阅读