题目:
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
示例 1:
输入: rowIndex = 3
输出: [1,3,3,1]
示例 2:
输入: rowIndex = 0
输出: [1]
示例 3:
输入: rowIndex = 1
输出: [1,1]
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle-ii
题解一:
首先把三角给生成好,最后再获取某一行的元素
public List<Integer> getRowFunc1(int rowIndex) {
//首先把三角给生成好
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
for(int i = 0;i < rowIndex + 1;i++){
List rowList = new ArrayList();
for(int j = 0;j <= i ; j ++){
if(j ==0 || j == i){
rowList.add(1);
}else{
rowList.add(triangle.get(i-1).get(j-1) + triangle.get(i-1).get(j));
}
}
trangle.add(rowList);
}
//最后再获取某一行的元素
List rowIndexList = triangle.get(rowIndex);
System.out.println(rowIndexList);
return rowIndexList;
}
题解二:
不把整个三角形都做出来,只存储上一层的list值即可:
{
//上一层
List<Integer> lastRow = new ArrayList();
if(rowIndex == 0){
lastRow.add(1);
return lastRow;
}
if(rowIndex == 1){
lastRow.add(1);
lastRow.add(1);
return lastRow;
}
//能走到这说明rowIndex>1
lastRow.add(1);
lastRow.add(1);
List<Integer> currentRow = new ArrayList();
for(int i = 2;i < rowIndex + 1;i++){
currentRow.clear();
for(int j = 0;j <= i ; j ++){
if(j ==0 || j == i){
currentRow.add(1);
}else{
currentRow.add(lastRow.get(j-1) + lastRow.get(j));
}
}
lastRow.clear();
lastRow.addAll(currentRow);
if(i == rowIndex){
break;
}
}
System.out.println(currentRow);
return currentRow;
}
上方代码写得太啰嗦了,生怕发生下标越界的情况,其实大胆点,代码就可以被优化成这样:
public List<Integer> getRowFunc2(int rowIndex) {
//上一层
List<Integer> lastRow = new ArrayList();
for(int i = 0;i < rowIndex + 1;i++){
List<Integer> currentRow = new ArrayList();
for(int j = 0;j <= i ; j ++){
if(j ==0 || j == i){
currentRow.add(1);
}else{
currentRow.add(lastRow.get(j-1) + lastRow.get(j));
}
}
lastRow = currentRow;
}
System.out.println(lastRow);
return lastRow;
}
时间复杂度O(n^2),空间复杂度O(n)。
题解三
找到每个值的规律
public List<Integer> getRowFunc3(int rowIndex) {
List<Integer> row = new ArrayList<Integer>();
row.add(1);
for (int i = 1; i <= rowIndex; ++i) {
row.add((int) ((long) row.get(i - 1) * (rowIndex - i + 1) / i));
}
System.out.println(row);
return row;
}
时间复杂度O(n),空间复杂度O(1)