leetcode 118 杨辉三角 (c++和python)

本文详细介绍了如何使用贪心算法生成杨辉三角的前n行,提供了C++和Python的实现代码,通过两层循环分别处理行和列,确保每行的首尾为1,中间值为左上角和右上角之和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目描述:

解题思路:

 C++代码:

python代码


题目描述:

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:

输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

解题思路:

贪心算法,保证每次局部操作是最优解,从而是最终得到的结果是全局最优解。

具体步骤,结果看成是二维数组,两层循环,外层行赋值,内层列赋值:

(1)行数i索引是0开始,每一行的开头和结束都是1;

(2)从第三行,即i=2开始,当前行的中间每一列值即从第二列j=1开始,到倒数第二列即j=i-1值都是(i,j) = (i-1, j-1) + (i-1, j),即左上角加右上角。

 C++代码:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6.4 MB, 在所有 C++ 提交中击败了55.13%的用户

通过测试用例:14 / 14

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        // 特殊情况
        if (numRows == 1) return {{1}};
        if (numRows == 2) return {{1}, {1, 1}};
        
        // 从第三行开始,即i=2开始
        vector<vector<int>> ans = {{1}, {1,1}};
        for (int i=2; i < numRows; i++)
        {
            vector<int> child_ans = {1}; // 每一行开头都是1.
            for (int j=1; j < i; j++)  // 每一行,从第2个即j=1开始,到倒数第2个结束,值都是(i,j) = (i-1,j-1) + (i-1,j)
                child_ans.push_back(ans[i-1][j-1] + ans[i-1][j]);
            child_ans.push_back(1);  // 每一行结束都是1.
            ans.push_back(child_ans);
        }
        return ans;
    }
};

python代码

执行用时:16 ms, 在所有 Python 提交中击败了62.93%的用户

内存消耗:13.1 MB, 在所有 Python 提交中击败了47.86%的用户

通过测试用例:14 / 14

class Solution(object):
    def generate(self, numRows):
        """
        :type numRows: int
        :rtype: List[List[int]]
        """
        # 特例
        if numRows == 1: return [[1]]
        elif numRows == 2: return [[1], [1, 1]]

        # 行数i索引是0开始
        # 从第三行,即i=2开始,每一行的开头和结束都是1,
        # 当前行的中间每一列值(i,j) = (i-1, j-1) + (i-1, j),即左上角加右上角。
        # 只要j<numRows-1则循环赋值.
        ans = [[1], [1, 1]]
        for i in range(2, numRows):  # # 从第三行,即i=2开始
            child_ans = [1]  # 每一行的开头是1
            for j in range(1, i):  # 每一行的中间即从第二行j=1开始,到倒数第二行即j=i-1,都是左上角加右上角.
                child_ans.append(ans[i-1][j-1] + ans[i-1][j])
            child_ans.append(1)  # 每一行的结束是1
            ans.append(child_ans)
        return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值