题目

Given a non-negative index k where k ≤ 33, return the $k^{th}$ index row of the Pascal’s triangle.

Note that the row index starts from 0.

0119. Pascal's Triangle II (E) - 图1
In Pascal’s triangle, each number is the sum of the two numbers directly above it.

Example:

  1. Input: 3
  2. Output: [1,3,3,1]

Follow up:

Could you optimize your algorithm to use only O(k) extra space?


题意

求出帕斯卡(杨辉)三角形的指定行的元素。

思路

可以直接建二维数组进行模拟;也可以压缩至一维数组进行处理;最省空间的是直接根据杨辉三角形的组合数性质直接计算出指定行的所有元素,即 $triangle[i][j]=C^j_i$ 。


代码实现

Java

二维数组

  1. class Solution {
  2. public List<Integer> getRow(int rowIndex) {
  3. List<Integer> ans = new ArrayList<>();
  4. int[][] triangle = new int[rowIndex + 1][rowIndex + 1];
  5. triangle[0][0] = 1;
  6. for (int i = 1; i <= rowIndex; i++) {
  7. for (int j = 0; j <= i; j++) {
  8. triangle[i][j] = j == 0 || j == i ? 1 : triangle[i - 1][j - 1] + triangle[i - 1][j];
  9. }
  10. }
  11. for (int i = 0; i <= rowIndex; i++) {
  12. ans.add(triangle[rowIndex][i]);
  13. }
  14. return ans;
  15. }
  16. }

一维数组

  1. class Solution {
  2. public List<Integer> getRow(int rowIndex) {
  3. List<Integer> ans = new ArrayList<>();
  4. int[] row = new int[rowIndex + 1];
  5. row[0] = 1;
  6. for (int i = 1; i <= rowIndex; i++) {
  7. for (int j = i; j >= 1; j--) {
  8. row[j] = row[j] + row[j - 1];
  9. }
  10. }
  11. for (int i = 0; i <= rowIndex; i++) {
  12. ans.add(row[i]);
  13. }
  14. return ans;
  15. }
  16. }

一维数组(直接List处理)

  1. class Solution {
  2. public List<Integer> getRow(int rowIndex) {
  3. List<Integer> ans = new ArrayList<>();
  4. ans.add(1);
  5. for (int i = 1; i <= rowIndex; i++) {
  6. for (int j = i; j >= 1; j--) {
  7. if (j == i) {
  8. ans.add(1);
  9. } else {
  10. ans.set(j, ans.get(j) + ans.get(j - 1));
  11. }
  12. }
  13. }
  14. return ans;
  15. }
  16. }

组合

  1. class Solution {
  2. public List<Integer> getRow(int rowIndex) {
  3. List<Integer> ans = new ArrayList<>();
  4. for (int i = 0; i <= rowIndex; i++) {
  5. ans.add(combination(rowIndex, i));
  6. }
  7. return ans;
  8. }
  9. private int combination(int i, int j) {
  10. if (j > i / 2) {
  11. return combination(i, i - j);
  12. }
  13. double ans = 1.0;
  14. while (j >= 1) {
  15. ans *= 1.0 * i-- / j--;
  16. }
  17. return (int) Math.round(ans);
  18. }
  19. }

JavaScript

  1. /**
  2. * @param {number} rowIndex
  3. * @return {number[]}
  4. */
  5. var getRow = function (rowIndex) {
  6. let k = 0
  7. let tri = [1]
  8. while (k != rowIndex) {
  9. let pre = 1
  10. for (let i = 1; i <= k; i++) {
  11. let cur = tri[i]
  12. tri[i] = cur + pre
  13. pre = cur
  14. }
  15. tri[++k] = 1
  16. }
  17. return tri
  18. }