⭐️前面的话⭐️
大家好!本篇文章将介绍力扣[118. 杨辉三角]与[119. 杨辉三角 II]题解,展示代码语言暂时为:C语言。(后续会更新Java与C++代码)
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2021年10月25日🌴
✉️坚持和努力一定能换来诗与远方!
💭刷题推荐书籍:📚《剑指offer第1版》,📚《剑指offer第2版》
💬参考在线编程网站:🌐牛客网🌐力扣
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
博主的码云gitee,平常博主写的程序代码都在里面。
⭐️LeetCode118. 杨辉三角⭐️
🔐题目详情
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
输入: numRows = 1
输出: [[1]]
提示:
1 <= numRows <= 30
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle/
💡解题思路
杨辉三角的一些基本性质:
💡杨辉三角每行第一个数和最后一个数为1
。
💡杨辉三角第n
行数字的个数为n
。
💡设一个杨辉三角有n
行m
列(0<n<21,0<m<21
),并将这个杨辉三角所有元素对应行列存入二维数组tri[20][20]
中,n>2时,则tri[n][m] = tri[n-1][m-1] +tri[n-1][m]
。
所以我们可以以tri[n][m] = tri[n-1][m-1] +tri[n-1][m]
为突破口,解决这道题。
这道题其实不难,难点在于二维数组的内存申请。本文重点为题解,二维数组内存申请不多赘述!
🔑源代码
int** generate(int numRows, int* returnSize, int** returnColumnSizes){
int i = 0;
int j = 0;
int** arr = (int**)malloc(sizeof(int*) * numRows);//申请int* 类型的数组,数量为行数,里面的int* 用来指向每行所对应的一维数组
*returnColumnSizes = (int*)malloc(sizeof(int) * numRows);//返回每行一维数组元素的个数,题目需要返回
for (i = 0; i < numRows; i++)
{
(*returnColumnSizes)[i] = i + 1;
arr[i] = (int*)malloc(sizeof(int) * (i + 1));//为每行的一维数组申请空间
for (j = 0; j < i + 1; j++)
{
if (i < 2 || j == 0 || j == i)
{
arr[i][j] = 1;//前两行与每行首末元素均为1
continue;
}
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];//杨辉三角中间元素为上一行相邻两元素和
}
}
*returnSize = numRows;
return arr;
}
⭐️LeetCode119. 杨辉三角 II⭐️
🔐题目详情
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
💡解题思路
解法1:构造杨辉三角,找到第rowIndex
行,并返回结果。
基于解法1的基础上,我们可以优化空间复杂度,使用滚动数组解决,解法2出现了。
所谓滚动数组,就是使用两个数组轮换求值。
解法2:由于每行的首末元素均为1
,所以默认将需要相互轮替的两个数组首末元素赋值为1
,进行滚动数组时不必考虑首末两位置。
🔑源代码
int* getRow(int rowIndex, int* returnSize){
int row = rowIndex + 1;//总行数
int* arr = (int*)malloc(sizeof(int) * row);//数组1,
int* pre = (int*)malloc(sizeof(int) * row);//数组2,相当于arr行前一行
int i = 0;
int j = 0;
arr[0] = 1;
pre[0] = 1;
arr[row - 1] = 1;
pre[row - 1] = 1;//首末元素赋值为1
for (i = 1; i < row - 1; i++ )
{
pre[i] = 1;//保证相对末位置值为1
for (j = 1; j <= i; j++)
{
arr[j] = pre[j] + pre[j - 1];//一行中间元素的值为上一行相邻两元素之和
}
int* tmp = pre;
pre = arr;
arr = tmp;//轮换数组,刷新pre数组,如果此时循环结束,pre为目标行数组
}
*returnSize = row;
return pre;//轮换后,最新数组为pre
}
🌱总结
解决杨辉三角的关键是每行首末位置元素为1,第三行开始每行中间的元素的值为前一行相同列与前一列所对应的两元素之和,即
tri[n][m] = tri[n-1][m-1] +tri[n-1][m]
。