题目:给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
解法一:这个题和之前118的杨辉三角的思路一样,只不过在最后输出的时候只输出最后一行
class Solution {
public List<Integer> getRow(int rowIndex) {
List<List<Integer>> column=new ArrayList<>();
for(int i=0;i<=rowIndex;i++) //在这里i的范围应该包含等号,否则出错
{
List<Integer>line=new ArrayList<>();
column.add(line);
if(i==0)
column.get(0).add(1);
else
{
for(int j=0;j<i+1;j++)
{
if(j==0||j==i)
column.get(i).add(1);
else{
int temp=column.get(i-1).get(j-1)+column.get(i-1).get(j);
column.get(i).add(temp);
}
}
}
}
return column.get(rowIndex);
}
}
解法二:以上的算法将整个杨辉三角全部计算出来了,但是空间复杂度不满足要求,以下是网上大神们的解法:
/*
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
*/
// 268ms
public class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> list = new ArrayList<Integer> (rowIndex + 1);
list.add(1);
if (rowIndex == 0) {
return list;
}
list.add(1);
if (rowIndex == 1) {
return list;
}
for (int i = 2; i <= rowIndex; ++i) {
list.add(1);
for (int j = i - 1; j > 0; --j) {
list.set(j, list.get(j) + list.get(j - 1));
}
}
return list;
}
}
在这个算法中只计算了第K行的数据,所占的空间小,空间复杂度达到要求。首先在计算第K行的元素时,有两次赋值1的操作,之后再外循环里每一个i值又有一个赋值为1 的操作。