每日一题:杨辉三角II

地址

难度

简单

题目

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 1:

输入: rowIndex = 3

输出: [1,3,3,1]

示例 2:

输入: rowIndex = 0

输出: [1]

示例 3:

输入: rowIndex = 1

输出: [1,1]

提示:

  • 0 <= rowIndex <= 33

进阶:

你可以优化你的算法到 O(rowIndex) 空间复杂度吗?

思路

  • 动态规划

杨辉三角的动态规划一样,只需要一层一层的求。但是不需要把每一层的结果都保存起来,只需要保存上一层的结果,就可以求出当前层的结果了。

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> list =new ArrayList<Integer>();
        List<Integer> tmp = new ArrayList<Integer>();
        for(int i = 0 ;i<rowIndex+1;i++){
            tmp = new ArrayList<Integer>();
            for(int j=0;j<i+1;j++){
                if(j==0||j==i){
                    tmp.add(1);
                }else {
                    tmp.add(list.get(j-1)+list.get(j));
                }
            }
            list = tmp;
        }
        return list;
    }
}
  • 公式

杨辉三角其实可以看做由组合数构成.其公式为:

image

最后可以等价于
image

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> list =new ArrayList<Integer>();
        long pre =1;
        list.add((int) pre);
        for(int i=1;i<rowIndex+1;i++){
            long tmp = pre*(rowIndex - i + 1)/i;
            list.add((int) tmp);
            pre = tmp;
        }
        return list;
    }
}