LeetCode 119. 杨辉三角 II

一、题目

1、题目描述

   给定一个非负索引 r o w I n d e x rowIndex rowIndex,返回「杨辉三角」的第 r o w I n d e x rowIndex rowIndex 行。在「杨辉三角」 中,每个数是它左上方和右上方的数的和。

2、基础框架

class Solution {
    public List<Integer> getRow(int rowIndex) {

    }
}

3、原题链接

LeetCode 119. 杨辉三角 II

二、解题报告

1、组合公式

1.1 思路分析

   ( 1 ) (1) (1) 排列: \textbf{排列:} 排列: n n n 个不同的元素中,任取 m ( m ⩽ n , m 与 n 均为自然数 ) m(m \leqslant n,m 与n均为自然数) m(mnmn均为自然数) 元素按照一定的顺序排成一列,叫做从 n n n 个元素中取出 m m m 个元素的一个排列;从 n n n 个不同元素中取出 m ( m ⩽ n ) m(m \leqslant n) m(mn) 个元素的所有排列的个数,叫做从 n n n 个不同元素中取出 m m m 个元素的排列数,用符号 A n m ( 或者是 P n m ) \mathrm{A_n^m}(或者是 \mathrm{P_n^m}) Anm(或者是Pnm)表示。排列的计算公式如下所示: A n m = n ! ( n − m ) ! = n × ( n − 1 ) × ( n − 2 ) ⋯ × ( n − m + 1 ) ⏟ m个数字 \mathrm{A_n^m} = \frac{n!}{(n-m)!} = \underbrace{n \times (n-1) \times (n-2) \cdots \times (n-m+1)}_{{\text{m个数字}}} Anm=(nm)!n!=m个数字 n×(n1)×(n2)×(nm+1)
   公式理解: \textup{公式理解:} 公式理解: n n n 个人选 m m m 个来排队 ( m ⩽ n ) (m \leqslant n) (mn) ;第一个位置可选择人选有 n n n 个,第二个位置可选择人选有 n − 1 n-1 n1 个,依此类推,第 m m m 个(最后一个)可选择人选有 n − m + 1 n-m+1 nm+1 个 。

   ( 2 ) (2) (2) 组合: \textbf{组合:} 组合: n n n 个不同元素中,任取 m ( m ⩽ n , m 与 n 均为自然数 ) m(m \leqslant n,m 与n均为自然数) m(mnmn均为自然数) 个元素组成一个集合,叫做从 n n n 个不同元素中取出 m m m 个元素的一个组合;从 n n n 个不同元素中取出 m ( m ⩽ n ) m(m\leqslant n) m(mn) 个元素的所有组合的个数,叫做从 n n n 个不同元素中取出 m m m 个元素的组合数。用符号 C n m \mathrm{C_n^m} Cnm 来表示。组合的计算公式如下所示: C n m = n ! ( n − m ) ! × m ! = n × ( n − 1 ) × ( n − 2 ) ⋯ × ( n − m + 1 ) m × ( m − 1 ) × ⋯ × 1 \mathrm{C_n^m} = \frac{n!}{(n-m)! \times m!} = \frac{n \times (n-1) \times (n-2) \cdots \times (n-m+1)}{m \times (m-1) \times \cdots \times 1} Cnm=(nm)!×m!n!=m×(m1)××1n×(n1)×(n2)×(nm+1)
   公式理解: \textup{公式理解:} 公式理解: 考虑从 n n n 个人中选取 m ( m ⩽ n ) m(m \leqslant n) m(mn) 个出来,不排队,不在乎顺序即为 C n m \mathrm{C_n^m} Cnm。如果在乎排列那么就是 A n m \mathrm{A_n^m} Anm,如果不在乎那么就要除掉重复,同样选出的来的 m m m 个人,他们还要全排列才能得 A n m \mathrm{A_n^m} Anm,所以得: C n m × m ! = A n m \mathrm{C_n^m} \times \mathrm{m!} = \mathrm{A_n^m} Cnm×m!=Anm C n m = A n m m ! = n ! ( n − m ) ! × m ! \mathrm{C_n^m} = \frac{\mathrm{A_n^m}}{\mathrm{m!}} = \frac{n!}{(n-m)! \times m!} Cnm=m!Anm=(nm)!×m!n! C n m = ( n m ) \mathrm{C_n^m} = \dbinom{n}{m} Cnm=(mn)
   ( 3 ) (3) (3) 杨辉三角: \textbf{杨辉三角:} 杨辉三角: 杨辉三角中第 n n n k k k (n   和   k都是从0开始计数) \textbf{(n 和 k都是从0开始计数)} (n  k都是从0开始计数) 列上的数为组合数 C n k \mathrm{C_n^k} Cnk;递推该公式可得: C n k = C n k − 1 × n − k + 1 k \mathrm{C_n^k} = \mathrm{C_n^{k-1}} \times \frac{n-k+1}{k} Cnk=Cnk1×knk+1 ;由于 C n 0 = 1 \mathrm{C_n^0} = 1 Cn0=1 ,利用该公式可以在线性时间内计算出第 n n n 行的所有组合数。

1.2 复杂度分析

  空间复杂度: O ( 1 ) O(1) O(1)
  时间复杂度: O ( n ) O(n) O(n)

1.3 代码详解

class Solution {
    public List<Integer> getRow(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));
        }
        return row;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值