leetcode题,
Given numRows, generate the first numRows of Pascal's triangle.
For example, given numRows = 5,
Return[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
这道题就是打印杨辉三角,作者写了一些方法,还是觉得在java里面下面这种方法要快速有效一些。首先
参考了这篇博文[LeetCode] Pascal's Triangle (java),该作者使用了一个子方法来产生一个第n层的杨辉数,有一
点值得肯定,就是必须要创建新的List<Integer>,有兴趣的读者可以使用Pascal's Triangle II这里面的方法,但是
发现最后会导致什么问题呢?你所有的List<List<Integer>>里的List<Integer>值都为最后的哪一个,一开始我也很
郁闷,后来网上查了一些资料,原来是每次传进List<List<Integer>>的List<Integer>都是其在内存里的一个引用,
而对象是同一个所以每次取都只会取到最新的值。所以需要对每个LIst<Integer>创建不同的对象。
上面那篇博文采用每次都创建一个从第一层开始的对象,这样要输出n层的整个图形必须要调用(n*(n-1))/2次,
不管对存储和运算都是极大的浪费。本文采用叠加的方式,子方法描述为后一层从前一层得到,而不是从第一层开
始。大大缩减了计算量。具体代码如下:
public class Solution {
public List<List<Integer>> generate(int numRows) {
<span style="white-space:pre"> </span>//打印前n行的list
//由上一个list产生下一个list
List<List<Integer>> listlist = new ArrayList<List<Integer>>();
List<Integer> list = new ArrayList<Integer>();
if(numRows == 0) return listlist;
list.add(1);
listlist.add(list);
if(numRows == 1) return listlist;
for(int i=1;i<numRows;i++)
{
list = genList(list);
listlist.add(list);
}
return listlist;
}
public static List<Integer> genList(List<Integer> listinput)//子方法
{
List<Integer> list = new ArrayList<Integer>();
int len = listinput.size();
list.add(1);
for(int j=1;j<=len-1;j++)
{
list.add(listinput.get(j-1)+listinput.get(j));
}
list.add(1);
return list;
}
}