杨辉三角II
1、给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
2、在杨辉三角中,每个数是它左上方和右上方的数的和。
3、输入: 3
输出: [1,3,3,1]
方法1:递归
/**
* 杨辉三角:递归:行数从0开始
* @param rowIndex
* @return
*/
public List<Integer> getRow(int rowIndex) {
List<Integer> ret = new ArrayList<Integer>();
if (rowIndex <0){
return ret;
}
//递归终止的条件
//rowIndex =0
if(rowIndex == 0){
ret.add(1);
return ret;
}
//递归的内容
List<Integer> pre = getRow(rowIndex - 1);
//通过前一行得到该行
for(int i = 0; i<= rowIndex; i++){
//第一个元素和最后一个元素为:1
if(i==0 || i == rowIndex){
ret.add(1);
}else{
//中间元素
ret.add(pre.get(i-1)+pre.get(i));
}
}
return ret;
}
方法2:动态规划
/**
* 杨辉三角:动态规划:行数从0开始
* @param rowIndex
* @return
*/
public List<Integer> getRow2(int rowIndex){
List<Integer> curRow = new ArrayList<Integer>();
if(rowIndex <0){
return curRow;
}
//第0行
if(rowIndex == 0){
curRow.add(1);
return curRow;
}
//其他行
//找到当前行的前一行
List<Integer> preRow = new ArrayList<Integer>();
for(int i = 0; i<= rowIndex; i++){
curRow = new ArrayList<Integer>();
for(int j = 0 ; j<=i;j++){
//第一个元素和最后一个元素
if(j == 0 || j == i){
curRow.add(1);
}else{
//中间元素
curRow.add(preRow.get(j-1) + preRow.get(j));
}
}//end for
preRow = curRow;
}
return curRow;
}