杨辉三角
原题:
思路: 动态规划。这个需要注意的时杨辉三角时从0开始的。然后再控制循环变量的时候,变量的边界值,取值需要思考。用代码来解释:
第一次错误示范:
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> dp=new ArrayList<>();
if(numRows==0)
return dp;
dp.add(new ArrayList<>());
dp.get(0).add(1);//第一行只有一个1,所以直接添加
for(int i=1;i<numRows;i++){//此处i从1开始,代表杨辉三角的第二行
List<Integer> row =new ArrayList<>();
List<Integer> prerow=dp.get(i-1);//定义杨辉三角的上一行
row.add(1);
for(int j=1;j<i-1;j++){
row.add(prerow.get(j)+prerow.get(j-1));
}
row.add(1);
dp.add(row);
}
return dp;
}
}
但是,i从1开始,代码运行结果第二行跟第三行都是[1,1],出现了问题。
分析:因为,当i=1和i=2时,中间的for循环都不执行,然后这两行只增加首和尾的1。所以,变量i要从2开始取值。并且要注意,定义上一行时,dp选取的行要是i-2。i不再代表杨辉三角第几行的含义,只是用它来控制循环。因为杨辉三角时从第零行开始的。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> dp=new ArrayList<>();
if(numRows==0)
return dp;
dp.add(new ArrayList<>());
dp.get(0).add(1);
for(int i=2;i<=numRows;i++){
List<Integer> row =new ArrayList<>();
List<Integer> prerow=dp.get(i-2);//此处注意,如果写i-1会报错
row.add(1);
for(int j=1;j<i-1;j++){
row.add(prerow.get(j)+prerow.get(j-1));
}
row.add(1);
dp.add(row);
}
return dp;
}
}
第二种解法:找规律
实际会发现,杨辉三角的当前行的是:上一行a与a向后移一位后,两者相加得到的。空位记得补零
上代码:
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> dp=new ArrayList<>();
if(numRows==0)
return dp;
List<Integer> first=new ArrayList<>();
first.add(1);
dp.add(new ArrayList(first));
int size=dp.size();
while(size<numRows){
LinkedList<Integer> former=new LinkedList<>();
LinkedList<Integer> latter=new LinkedList<>();
former.addFirst(0);//空位补零
latter.addLast(0);
for(int i:dp.get(size-1)){
former.addFirst(i);
latter.addLast(i);
}
List<Integer> newrow=new ArrayList<>();
for(int j=0;j<=size;j++){//注意j的取值范围,因为补零之后,长度增加1
newrow.add(former.get(j)+latter.get(j));
}
dp.add(newrow);
size++;
}
return dp;
}
}
PS:这里学习到了一种新的数据结构,双端链表,LinkedList
主要用到的函数是,头插和尾插。addFirst()和addLast()
杨辉三角Ⅱ
原题
思路: 跟上一题不同的是,这里要求返回的是杨辉三角的第k行。不需要再判断k是否为0,0也是正常的行数。并且再循环行数的时候,要比上一题多循环一次。因为这次需要的是杨辉三角的第k行。
上代码:
class Solution {
public List<Integer> getRow(int rowIndex) {
List<List<Integer>> dp=new ArrayList<>();
List<Integer> first =new ArrayList<>();
first.add(1);
dp.add(first);
for(int i=2;i<=rowIndex+1;i++){ //这里需要注意,比上一题多循环一遍
List<Integer> row=new ArrayList<>();
List<Integer> prerow= dp.get(i-2);
row.add(1);
for(int j=1;j<i-1;j++){
row.add(prerow.get(j)+prerow.get(j-1));
}
row.add(1);
dp.add(row);
}
return dp.get(rowIndex);
}
}