C#解leetcode:119. Pascal's Triangle II
题目是:
Given an index k, return the kth row of the Pascal's triangle.
For example, given k = 3,
Return [1,3,3,1]
.
Note:
Could you optimize your algorithm to use only O(k) extra space?
(注意:这里要求空间为O(k))
一个满足条件的答案如下:
public class Solution { public IList<int> GetRow(int rowIndex) { List<int> res = new List<int>(); for(int i=0;i<rowIndex+1;i++) res.Add(1); //赋初值 for(int i=1;i<rowIndex;i++) { for(int j=i;j>0;j--) res[j] += res[j-1] ; } return res; } }
总结:
1 首先生成一个list列表,并且将所有的值都赋初值,初值为1
2 每执行一次外部的for循环,则更新一行的信息。例如,当执行完i=1这一次循环后,将list列表更新为 原来帕斯卡三角形的 第三行的数据。当执行完i=2这一次循环后,将list列表更新为 原来帕斯卡三角形的 第四行的数据。
3 内部的for循环的初值必须为j=i,也就是说不能从j=1开始。因为,每一行的元素的值都是由上一行的元素的值确定,其中第i行的res[j] 就是第i-1行的res[j] += res[j-1] 的结果,如果从j=1开始循环,则list列表的值从左到右开始更新,当第一个元素更新后,就不能用它产生第二个元素(因为第二个元素的产生和第一个元素的值有关系,现在第一个元素的值丢失了)。但如果从j=i开始循环,就是list列表的值从右到左开始更新,当倒数第一个值更新后,并不影响倒数第二个值的更新,因为倒数第二个值得更新仅仅和倒数第二个值本身以及倒数第三个值有关,我们倒数第一个值的更新并没有更改这两个元素,所以没有元素丢失,可以顺利更新完一行。