我的解决方案:比较懒,直接使用了上一题的代码
class Solution {
public List<Integer> generate(int numRows) {
List<List<Integer>> outter=new ArrayList<List<Integer>>();
ArrayList<Integer> inner = new ArrayList<Integer>();
inner.add(1);
outter.add(inner);
int outterIndex=0;
while(outter.size()!=numRows+1) {
ArrayList<Integer> lastLevel = (ArrayList<Integer>) outter.get(outterIndex);
ArrayList<Integer> tmp = new ArrayList<Integer>();
for(int i=0;i<lastLevel.size()+1;i++) {
int left=i>0?lastLevel.get(i-1):0;
int right=i<lastLevel.size()?lastLevel.get(i):0;
int res=left+right;
tmp.add(res);
}
outter.add(tmp);
outterIndex++;
}
return outter.get(outter.size()-1);
}
public List<Integer> getRow(int rowIndex) {
return generate(rowIndex);
}
}
提交记录中执行耗时最短的代码:这个解法使用了杨辉三角的一个特性:
第n行的第1个数为1,第二个数为1×(n-1),第三个数为1 × (n-1) × (n-2) / 2,第四个数为1 × (n-1) × (n-2) / 2 × (n-3) / 3…依此类推。
其实就是前一个数作为后一个数乘式的被乘数,乘数是rowIndex-index+1
,除式中的除数就是index-1
class Solution {
public List<Integer> getRow(int rowIndex) {
rowIndex+=1;
List<Integer> ret = new LinkedList<Integer>();
long nk = 1;
ret.add((int)nk);
for (int i = 2; i <= rowIndex; i++) {
nk = nk * (rowIndex - i + 1) / (i - 1);
ret.add((int)nk);
}
return ret;
}
}