求大佬帮忙分析这份代码的思路

weixin_45906870 2020-08-07 12:36:48
题目:
杨辉三角 II

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。


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

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

代码:
int* getRow(int rowIndex, int* returnSize){
* returnSize = rowIndex + 1;
int* array = (int *)malloc(sizeof(int) * (rowIndex+1));
for(int i=0; i<rowIndex+1; i++){
array[i]=1;
for(int j=i-1; j>0; j--) array[j] = array[j] + array[j-1]; //这个for循环看不懂,这个计算公式是怎么来的?
array[0] = 1;
}
return array;
}

求大佬帮忙分析这份代码的思路
...全文
114 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_49489558 2020-08-11
  • 打赏
  • 举报
回复
第N行的第J个数就是第N-1行的第J个和第J-1个的和,自己推才有意思哈
qybao 2020-08-07
  • 打赏
  • 举报
回复
这个for要结合上面的array[i] = 1和下面的array[0] = 1一起来看
首先要知道i层循环的意义,i层循环的结果就是得到第i行的数据,如1L所说
那么来看具体分析
array[i] = 1 这里首先就是设定第i行的最后一个元素
然后for j 循环依次倒推第i行的i-1位置之前的元素 //先理解这个,下面再详细展开
最后再array[0] = 1设定第i行的0位置的元素,这样第i行的数据就生成了

好,再来展开for j 循环
i=0时,array[i]=array[0]=1,for j循环没有满足跳过执行,最后array[0]=1,所以第i=0行的结果就只有1个元素 array[0]=1,即array[]={1}

i=1时,array[i]=array[1]=1,看到了没,相当于在第0行的基础上,在最后的位置最后追加一个元素(也就是多了个元素),即array[0]=1(原来i=0循环时生成),array[1]=1(本次i循环时生成的),然后for j没满足跳过执行,最后array[0]=1,所以第i=1行的结果就是有2个元素,即array[]={1,1}

i=2时,array[i]=array[2]=1,看到了没,又在第1行的基础上在末尾多追加了一个元素array[2]=1,即此时 array[]={1,1,1},然后进入for j循环,倒推array[2]位置之前的元素,首先看j=i-1,即array[i-1]=array[1]的情况,我们用图的方式展示
i=1时,array[]={1,1} //这是上一次i循环的结果,也就是第1行
i=2时,array[]={1,1,1} //这是本次i循环,也就是第2行,array[j]=array[i-1]是不是相当于第1行的最后一个元素(蓝上)?那么array[j-1]是不是相当于第1行的倒数第二个元素(绿上)?所以array[j](蓝上)+array[j-1](绿上)=array[j](蓝下)=1+1=2
所以就可以倒推出第2行的j位置的元素,依次继续往前类推,直到for j循环结束,最后再array[0]=1,就是把第2行的首元素设为0,所以最终结果,第i=2行有3个元素,即array={1,2,1}

i=3时,先array[i]=array[3]=1在第2行的基础上在最后追加一个元素,即如下图
i=2时,array[]={1,2,1}
i=3时,array[]={1,2,1,1}
然后for j 循环 ,第1次j循环
i=2时,array[]={1,2,1}
i=3时,array[]={1,2,1,1}
得到
i=2时,array[]={1,2,1}
i=3时,array[]={1,2,3,1}
第2次for j循环
i=2时,array[]={1,2,1}
i=3时,array[]={1,2,3,1}
得到
i=2时,array[]={1,2,1}
i=3时,array[]={1,3,3,1}
然后j循环退出,再array[0]=1,最终第i=3行有4个元素,即array[]={1,3,3,1}

所以for j不是公式,相当于把上一行(i-1行)的结果依次倒推,两两元素相加的结果最为本行(i行)的第 j 个元素




weixin_45906870 2020-08-07
  • 打赏
  • 举报
回复
为什么刚好得到不同阶的数?
棉猴 2020-08-07
  • 打赏
  • 举报
回复
这个for循环,每循环一次,得到不同阶数的值,例如第一次循环得到[1,1],第二次循环得到[1,2,1],第三次循环得到[1,3,3,1]
weixin_45906870 2020-08-07
  • 打赏
  • 举报
回复
引用 3 楼 qybao 的回复:
这个for要结合上面的array[i] = 1和下面的array[0] = 1一起来看
首先要知道i层循环的意义,i层循环的结果就是得到第i行的数据,如1L所说
那么来看具体分析
array[i] = 1 这里首先就是设定第i行的最后一个元素
然后for j 循环依次倒推第i行的i-1位置之前的元素 //先理解这个,下面再详细展开
最后再array[0] = 1设定第i行的0位置的元素,这样第i行的数据就生成了

好,再来展开for j 循环
i=0时,array[i]=array[0]=1,for j循环没有满足跳过执行,最后array[0]=1,所以第i=0行的结果就只有1个元素 array[0]=1,即array[]={1}

i=1时,array[i]=array[1]=1,看到了没,相当于在第0行的基础上,在最后的位置最后追加一个元素(也就是多了个元素),即array[0]=1(原来i=0循环时生成),array[1]=1(本次i循环时生成的),然后for j没满足跳过执行,最后array[0]=1,所以第i=1行的结果就是有2个元素,即array[]={1,1}

i=2时,array[i]=array[2]=1,看到了没,又在第1行的基础上在末尾多追加了一个元素array[2]=1,即此时 array[]={1,1,1},然后进入for j循环,倒推array[2]位置之前的元素,首先看j=i-1,即array[i-1]=array[1]的情况,我们用图的方式展示
i=1时,array[]={1,1} //这是上一次i循环的结果,也就是第1行
i=2时,array[]={1,1,1} //这是本次i循环,也就是第2行,array[j]=array[i-1]是不是相当于第1行的最后一个元素(蓝上)?那么array[j-1]是不是相当于第1行的倒数第二个元素(绿上)?所以array[j](蓝上)+array[j-1](绿上)=array[j](蓝下)=1+1=2
所以就可以倒推出第2行的j位置的元素,依次继续往前类推,直到for j循环结束,最后再array[0]=1,就是把第2行的首元素设为0,所以最终结果,第i=2行有3个元素,即array={1,2,1}

i=3时,先array[i]=array[3]=1在第2行的基础上在最后追加一个元素,即如下图
i=2时,array[]={1,2,1}
i=3时,array[]={1,2,1,1}
然后for j 循环 ,第1次j循环
i=2时,array[]={1,2,1}
i=3时,array[]={1,2,1,1}
得到
i=2时,array[]={1,2,1}
i=3时,array[]={1,2,3,1}
第2次for j循环
i=2时,array[]={1,2,1}
i=3时,array[]={1,2,3,1}
得到
i=2时,array[]={1,2,1}
i=3时,array[]={1,3,3,1}
然后j循环退出,再array[0]=1,最终第i=3行有4个元素,即array[]={1,3,3,1}

所以for j不是公式,相当于把上一行(i-1行)的结果依次倒推,两两元素相加的结果最为本行(i行)的第 j 个元素
qybao大佬,永远滴神!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧