118.杨辉三角
动态规划通过row.add(prevRow.get(j-1) + prevRow.get(j))来复用计算。
官答。除去==0的特殊情况,其他情况都包含第一行。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>(); //需要返回的直接定义出来,总不能放for代码段里吧。。。。
// 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); //剩余情况第一行为1
for (int rowNum = 1; rowNum < numRows; rowNum++) {
List<Integer> row = new ArrayList<>(); //每次for循环生成一行
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); //在list中一行行嵌入list
}
return triangle;
}
}
第一次写的很多冗余代码(没法看了,119答的还勉强能看),注意假如for循环从第二行开始,第二层for循环在此时是不执行的。。。。
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> list=new ArrayList<List<Integer>>();
if(numRows==0) return list;
if(numRows==1){
List <Integer> list1=new ArrayList <Integer>();
list1.add(1);
list.add(list1);
}else if(numRows==2){
List <Integer> list1=new ArrayList <Integer>();
list1.add(1);
List <Integer> list2=new ArrayList <Integer>();
list2.add(1);list2.add(1);
list.add(list1);list.add(list2);
}else{
List <Integer> list31=new ArrayList <Integer>();
list31.add(1);
List <Integer> list32=new ArrayList <Integer>();
list32.add(1);list32.add(1);
list.add(list31);list.add(list32);
for(int i=2;i<numRows;i++){
List<Integer> list_temp=new ArrayList<Integer>();
list_temp.add(1);
for(int j=1;j<i;j++){
int temp=list.get(i-1).get(j-1)+list.get(i-1).get(j);
list_temp.add(temp);
}
list_temp.add(1);
list.add(list_temp);
}
}
return list;
}
}
虽然很简单,但是记录好像能凑齐龙珠召唤神龙啊啊啊啊啊
119.杨辉三角 ||
注意是索引。通过一个中间list保存新的计算结果来实现复用。
class Solution {
public List<Integer> getRow(int rowIndex) {
List <Integer> list=new ArrayList <Integer>(); //最终需要返回
if (rowIndex == 0) { //特殊情况
list.add(1);
}
List <Integer> list_on=new ArrayList <Integer>();//for循环外定义,循环里定义不方便保留新计算的一行
for (int lineNum = 1; lineNum <= rowIndex; lineNum++) {
list.add(1);
for(int rowNum =1; rowNum <lineNum; rowNum++){
list.add(list_on.get(rowNum-1)+list_on.get(rowNum)); //计算新的一行
}
list.add(1);
if(lineNum!=rowIndex){ //注意加判断,如果遍历到目标行就不clear了
list_on.clear();
list_on.addAll(list); //保留新计算的行,在下一次循环中复用计算
list.clear();
}
}
return list;//返回函数内一定要有直接的return,方法内的代码段可有其他return来提前返回。
}
}