文内代码全部采用JAVA语言。
题目
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。
测试用例
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
个人解法
杨辉三角大家都很熟悉了。这题的输入是三角的行数,输出是双层List,内层的list是每一行的数字集合,外层是内层list的集合。这个还是很好理解的。
思路是遍历。首先对行数numRows循环,再对每一行的元素循环。ArrayList提供了迭代器可以使用。对于特殊的numRows=0和的情况,都不能通过循环生成,所以直接if,返回答案。对于新的一行的产生,需要遍历上层行的元素,因此新建两个ArrayList,row1和row2。具体解释参见代码中注释。
执行用时: 1 ms, 在Pascal’s Triangle的Java提交中击败了95.00% 的用户
class Solution {
public List<List<Integer>> generate(int numRows) {
List<Integer> row1=new ArrayList<Integer>();//上层行
List<List<Integer>> ans=new ArrayList<List<Integer>>();//输出答案
if (numRows==0) {
return ans;//输入0,返回[]
}
row1.add(1);//第一行的初始值[1]
ans.add(row1);//将第一行放入答案
if (numRows==1) {
return ans;//输入1,返回[[1]]
}
for (int i = 2; i <=numRows; i++) {
//从行数大于等于2时,可以开始遍历求解。循环体用不到i,只是用于计数
Iterator<Integer> it=row1.iterator();
//生成迭代器,对上层的元素进行遍历。比如i=3时,迭代循环第二行
int a=0;//a用于存放前一个加数。
List<Integer> row2=new ArrayList<Integer>();//新建row2,存放和值
while (it.hasNext()) {
int b=it.next();//b是每行第一个数到最后一个数
row2.add(a+b);//在row2中添加和值
a=b;//向后移动
}
row2.add(1);//每行最后一个值,全都是1
row1=row2;//准备求row2下一行,这时需要遍历row2
ans.add(row2);//将row2添加到ans
}
return ans;
}
}
官方解法
思路
如果能够知道一行杨辉三角,我们就可以根据每对相邻的值轻松地计算出它的下一行。
算法
与个人解法基本一致,只是这里用的是ArrayList.get,使代码看起来较为简洁。同样是嵌套两层循环,运行时间也差不多,都是1ms。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
// First base case; if user requests zero rows, they get zero rows.
if (numRows == 0) {
return triangle;
}
// Second base case; first row is always [1].
triangle.add(new ArrayList<>());
triangle.get(0).add(1);
for (int rowNum = 1; rowNum < numRows; rowNum++) {
List<Integer> row = new ArrayList<>();
List<Integer> prevRow = triangle.get(rowNum-1);
// The first row element is always 1.
row.add(1);
// Each triangle element (other than the first and last of each row)
// is equal to the sum of the elements above-and-to-the-left and
// above-and-to-the-right.
for (int j = 1; j < rowNum; j++) {
row.add(prevRow.get(j-1) + prevRow.get(j));
}
// The last row element is always 1.
row.add(1);
triangle.add(row);
}
return triangle;
}
}