1. 程式人生 > 實用技巧 >0119. Pascal's Triangle II (E)

0119. Pascal's Triangle II (E)

Pascal's Triangle II (E)

題目

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.


In Pascal's triangle, each number is the sum of the two numbers directly above it.

Example:

Input: 3
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

二維陣列

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> ans = new ArrayList<>();
        int[][] triangle = new int[rowIndex + 1][rowIndex + 1];
        triangle[0][0] = 1;

        for (int i = 1; i <= rowIndex; i++) {
            for (int j = 0; j <= i; j++) {
                triangle[i][j] = j == 0 || j == i ? 1 : triangle[i - 1][j - 1] + triangle[i - 1][j];
            }
        }

        for (int i = 0; i <= rowIndex; i++) {
            ans.add(triangle[rowIndex][i]);
        }

        return ans;
    }
}

一維陣列

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> ans = new ArrayList<>();
        int[] row = new int[rowIndex + 1];
        row[0] = 1;

        for (int i = 1; i <= rowIndex; i++) {
            for (int j = i; j >= 1; j--) {
                row[j] = row[j] + row[j - 1];
            }
        }

        for (int i = 0; i <= rowIndex; i++) {
            ans.add(row[i]);
        }

        return ans;
    }
}

一維陣列(直接List處理)

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> ans = new ArrayList<>();
        ans.add(1);

        for (int i = 1; i <= rowIndex; i++) {
            for (int j = i; j >= 1; j--) {
                if (j == i) {
                    ans.add(1);
                } else {
                    ans.set(j, ans.get(j) + ans.get(j - 1));
                }
            }
        }

        return ans;
    }
}

組合數

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> ans = new ArrayList<>();

        for (int i = 0; i <= rowIndex; i++) {
            ans.add(combination(rowIndex, i));
        }

        return ans;
    }

    private int combination(int i, int j) {
        if (j > i / 2) {
            return combination(i, i - j);
        }

        double ans = 1.0;
        while (j >= 1) {
            ans *= 1.0 * i-- / j--;
        }

        return (int) Math.round(ans);
    }
}

JavaScript

/**
 * @param {number} rowIndex
 * @return {number[]}
 */
var getRow = function (rowIndex) {
  let k = 0
  let tri = [1]
  while (k != rowIndex) {
    let pre = 1
    for (let i = 1; i <= k; i++) {
      let cur = tri[i]
      tri[i] = cur + pre
      pre = cur
    }
    tri[++k] = 1
  }
  return tri
}