LeetCode_118. 杨辉三角_119. 杨辉三角 II_动态规划_动态二维数组

118. 杨辉三角

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

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

示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
请添加图片描述

示例 2:
输入: numRows = 1
输出: [[1]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];

使用二维数组:
————————————————
版权声明:本文为CSDN博主「持久的棒棒君」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lalala_dxf/article/details/120106430

//杨辉三角
#include<stdio.h>
#define N 10
int main(void)
{
	int i, j, a[N][N];

	//令两边的数都为1
	for (i = 0; i < N; i++)
	{
		a[i][0] = a[i][i] = 1;
	}

	//除两边的数外都等于上两项数之和
	for (i = 2; i < N; i++)
	{
		for (j = 1; j < i; j++)
		{
			a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
		}
	}

	//控制输出,每行最后一个数字没有空格,相邻两数字之间有空格
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < i+1; j++)
		{
			if (j == i)
				printf("%d", a[i][j]);
			else
				printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

力扣官方代码

int** generate(int numRows, int* returnSize, int** returnColumnSizes) {
    int** ret = malloc(sizeof(int*) * numRows);//初始化二维数组的行 int** ret为行指针
    *returnSize = numRows;
    *returnColumnSizes = malloc(sizeof(int) * numRows);
    for (int i = 0; i < numRows; ++i) {
        ret[i] = malloc(sizeof(int) * (i + 1));//ret[i]为列指针 malloc返回一个指针 ,指向已分配大小的内存
        (*returnColumnSizes)[i] = i + 1;
        ret[i][0] = ret[i][i] = 1;
        for (int j = 1; j < i; ++j) {
            ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1];
        }
    }
    return ret;
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/pascals-triangle/solution/yang-hui-san-jiao-by-leetcode-solution-lew9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

理解补充:

int ** 的理解:https://yian.me/blog/what-is/pointer-to-pointer-in-c-programing-language.html?utm_source=tuicool&utm_medium=referral

int  i   整型
int*  pi 是指向整型变量的指针
int**  ppi 指向 指向整型变量的指针 指针
#include <stdio.h>

int main()
{
    int i = 418;

    int* pi;

    pi = &i;

    int** ppi;

    ppi = &pi;

    printf("*pi = %d, *ppi = %p\n", *pi, * ppi);
    printf("**ppi = %d\n", **ppi);

    return 0;
}
 pi 可以保存的是 int 类型的变量 i 的地址;
 *pi 就是取得 i 存放的值,类型是 int;
 ppi 可以保存的是 int* 类型的变量 pi 的地址;
 *ppi 取得的是 pi 存放的值,类型是 int*

(pi=-368051356,ppi=-368051320)
*pi = 418, *ppi = 000000BAEA0FFB64
**ppi = 418

119. 杨辉三角 II

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

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

示例 1:
输入: rowIndex = 3
输出: [1,3,3,1]

示例 2:
输入: rowIndex = 0
输出: [1]

示例 3:
输入: rowIndex = 1
输出: [1,1]

提示:
0 <= rowIndex <= 33

进阶:
你可以优化你的算法到 O(rowIndex) 空间复杂度吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* getRow(int rowIndex, int* returnSize){
    *returnSize = rowIndex+1;
    int* C[rowIndex+1];
    for(int i=0;i<=rowIndex;i++){
        C[i]=malloc(sizeof(int) * (i+1));
        C[i][0]=C[i][i]=1;
        for(int j=1;j<i;j++){
            C[i][j]=C[i-1][j-1]+C[i-1][j];
        }
    }
    return C[rowIndex];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值