119. Pascal's Triangle II (E)

半腔热情 提交于 2019-11-29 11:24:49

Pascal’s Triangle II (E)

Given a non-negative index k where k ≤ 33, return the kthk^{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]=Cijtriangle[i][j]=C^j_i


代码实现 - 二维数组

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);
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!