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 i 整型
int* pi 是指向整型变量的指针
int** ppi 指向 指向整型变量的指针 指针
#include <stdio.h>
int main()
{
int i = 418;
int* pi;
pi = &i;
int** ppi;
ppi = π
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];
}