杨辉三角

题目地址:https://leetcode.cn/problems/pascals-triangle/
动态规划解法

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> arr;
        vector<int> t;t.push_back(1);
        arr.push_back(t);
        // dp[i][j]:第i行j列的元素为dp[i][j]
        int dp[numRows][numRows];
        // 初始值:dp[0][0] = 1;两侧数据都为1;
        // 递推表达式:dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
        for(int i=1;i<numRows;i++){
            // 存储每一行数据的临时数组
            vector<int> tr;
            for(int j=0;j<i+1;j++){
                if(j == 0 || j == i){
                    dp[i][j] = 1;
                    tr.push_back(dp[i][j]);
                }else{
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
                    tr.push_back(dp[i][j]);
                }
            }
            arr.push_back(tr);
        }
        return arr;
    }
};

数学解法

利用概率论的组合数
第i行i列数据为(j=0<i):(i-1)!/((j!)*(i-1-j)!)
用于推理,代码实现还是算了,可能行数太多,设计精度问题

杨辉三角2
动态规划

class Solution {
public:
    // 动态规划  -- 每次只保存上一行数据
    vector<int> getRow(int rowIndex){
        vector<int> t;
        t.push_back(1);
        if(rowIndex == 0)
            return t;
        // dp[i][j]:第i行j列元素的数据值为dp[i][j]
        int dp[rowIndex+1][rowIndex+1];
        // 初始化
        dp[0][0] = 1;
        for(int i = 1;i<=rowIndex;i++){
            vector<int> arr;
            for(int j = 0;j<i+1;j++){
                if(j == 0 || j == i)
                    dp[i][j] = 1;
                else{
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
                }
            }
        }
        t.clear();
        for(int j = 0;j<rowIndex+1;j++){
            t.push_back(dp[rowIndex][j]);
        }
        return t;
    }
};
posted @ 2022-08-07 16:05  nanfengnan  阅读(6)  评论(0编辑  收藏  举报