【新手上路】LeetCode刷题之杨辉三角(二)

这篇博客讲述了如何使用动态规划解决杨辉三角的第二部分问题,分别提供了C++和Python的实现。作者强调了在C++中动态分配内存的重要性,并分享了Python的优化策略,包括预处理前两行以提高效率。博客还提醒了在返回结果时注意数组索引的正确使用。

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

几个星期前做了一道“伪动态规划”的题目杨辉三角一,现在来试试位于它下面的那道题目(二)

同样地,动画做得很好,只是我微薄的算法技巧配不上这么优秀的动画了,呜呜呜~。

以下是代码。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

/*以上是LeetCode刷题面板自带的注释,因为下面要返回我们自己的数组,所以必须去堆里申请空间,
如果在栈里申请一段连续的空间作为数组的话在return之前会被回收*/

int* getRow(int rowIndex, int* returnSize){
    *returnSize = rowIndex+1;  //观察图片和例子不难发现,第几行它的个数就是行数+1,然后直接赋值就好
    int *result[rowIndex+1];
//因为我们是动态规划,所以我们在优化前必须要“升高维度”,要求我们返回一个一位数组,我们就得申请一个二维数组
    for(int i=0;i<rowIndex+1;i++)
    {
        result[i] = (int *)malloc(sizeof(int)*(i+1));  //我们只需要返回的那段数组从堆里申请就好了,所以二维数组的指针可以从栈中获取
//以下是动态规划的两个初始条件:从图中可以看到,我们最左边和最后边的数肯定是0.
        result[i][0] = 1;  
        result[i][i] = 1;
//以下是dp表达式,和之前的差不多,上面相邻两项之和。
        for(int j=1;j<i;j++)
        {
            result[i][j] = result[i-1][j-1]+result[i-1][j];
        }
    }
//最好返回的时候要注意了,我写的时候[rowIndex]这个东西给忘了,结果一直还找不到错在哪儿了。哈哈,其实要求返回一行(一位数组)啦。
    return result[rowIndex];
}

 其实吧,在CSDN写一遍过程和注释对算法的学习帮助会更大(让思路更清晰),毕竟像我这样不太聪明的人,学算法确实有点困难,坚持下去吧。

以下是Python的做法和解析:

class Solution:
    def getRow(self, rowIndex):
        result = [[1],[1,1]]  #和上次的类似,为了提高效率,前两种情况就手动写好了
        if rowIndex == 0:
            return result[0]
        elif rowIndex==1:
            return result[1]
        else:
            for i in range(2,rowIndex+2):  
                temp = [1,1]
                for j in range(i-2):
                    temp.insert(j+1,result[i-1][j]+result[i-1][j+1]) #dp表达式和之前差不多
                result.append(temp)  #把产生的新列表添加到末尾
        return result[rowIndex+1]

class Solution:
    def getRow(self, rowIndex):
        result = [[1],[1,1]]
        if rowIndex == 0:
            return result[0]
        elif rowIndex==1:
            return result[1]
        else:
            for i in range(2,rowIndex+2):
                temp = [1,1]
                for j in range(i-2):
                    temp.insert(j+1,result[i-1][j]+result[i-1][j+1])
                result.append(temp)
        return result[-1]

 

如果最后直接用索引-1的话,牺牲时间换空间,不太值得。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

April__Zhao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值