题目
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
我的代码
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> firstline = new ArrayList();
firstline.add(1);
if (rowIndex == 0) {return firstline;}
List <Integer> secondline = new ArrayList();
secondline.add(1);
secondline.add(1);
if (rowIndex == 1) {return secondline;}
List<Integer> lastturn = secondline;
for (int i=2; i<=rowIndex; i++){
List<Integer> thisturn = new ArrayList();
thisturn.add(1);
for (int j=1; j<lastturn.size(); j++){
thisturn.add(lastturn.get(j-1) + lastturn.get(j));
}
thisturn.add(1);
lastturn = thisturn;
}
return lastturn;
}
}
小结
首先要承认,这里回去抄了杨辉三角1的代码。并回忆起了,写1的时候,我本想直接计算每一行(用组合数),然后被计算阶层卡住,没想到又一次遇到了,我还是不能很好地处理阶层问题,这次一定要好好学一学。
他人代码
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> list = new ArrayList<>(rowIndex + 1);
long s = 1;
for(int i = 0; i <= rowIndex; i++){
list.add((int)s);
s = s * (rowIndex - i) / (i + 1);
}
return list;
}
}
按照组合数公式,第i个数(从0开始)是CrowIndex+1i=(rowIndex+1)!i!∗(rowIndex+1−i)!C_{rowIndex+1}^{i}=\frac{(rowIndex+1)!}{i!*(rowIndex+1-i)!}CrowIndex+1i=i!∗(rowIndex+1−i)!(rowIndex+1)!(因为rowIndex从0开始数)
那么,第i+1个数是CrowIndex+1i+1=(rowIndex+1)!(i+1)!∗(rowIndex−i)!C_{rowIndex+1}^{i+1}=\frac{(rowIndex+1)!}{(i+1)!*(rowIndex-i)!}CrowIndex+1i+1=(i+1)!∗(rowIndex−i)!(rowIndex+1)!
两者相差rowIndex−ii+1\frac{rowIndex-i}{i+1}i+1rowIndex−i
也就是大佬的代码的意思了。
十分受教!