LeetCode:Pascal‘s Triangle II - 帕斯卡三角形2

1、题目名称

Pascal‘s Triangle II(帕斯卡三角形2)

2、题目地址

https://leetcode.com/problems/pascals-triangle-ii/

3、题目内容

英文:Given an index k, return the kth row of the Pascal‘s triangle.

中文:给出行数k,返回帕斯卡三角形的第k行

例如,k=3时,返回[1,3,3,1]

4、解题方法1

帕斯卡三角形也叫杨辉三角形,在LeetCode第118题(Pascal‘s Triangle)中,已经实现了按杨辉三角形的定义自上到下生成各列。这个方法也可以用于求指定行。

一段实现此方法的Java代码如下:

import java.util.ArrayList;
import java.util.List;

/**
 * 功能说明:LeetCode 119 - Pascal‘s Triangle II
 * 开发人员:Tsybius2014
 * 开发时间:2015年8月14日
 */
public class Solution {
    
    /**
     * 获取帕斯卡三角形的指定行
     * @param rowIndex 行数
     * @return
     */
    public List<Integer> getRow(int rowIndex) {
        
        if (rowIndex < 0) {
            return null;
        }
        
        ArrayList<Integer> resultList = new ArrayList<Integer>();
        
        //第一行
        resultList.add(1);
        
        //之后各行
        for (int i = 0; i < rowIndex; i++) {
            resultList = getNextArray(resultList);
        }
        
        return resultList;
    }

    /**
     * 给定帕斯卡三角形的一行数据,获取下一行数据
     * @param array 帕斯卡三角形某一行
     * @return 帕斯卡三角形的下一行
     */
    public ArrayList<Integer> getNextArray(ArrayList<Integer> arrayList) {

        if (arrayList == null) {
            return null;
        }

        ArrayList<Integer> nextList = new ArrayList<Integer>();

        nextList.add(1);
        for (int i = 0; i + 1 < arrayList.size(); i++) {
            nextList.add(arrayList.get(i) + arrayList.get(i + 1));
        }
        nextList.add(1);
        
        return nextList;
    }
}

5、解题方法2

另一个办法是利用杨辉三角形的特性,即第n行的第k个数字为组合数 C(n-1, k-1),这样只需要写一个计算组合数的函数,调用n次就可以了。不过这里要注意,组合数的计算过程中,为了防止中间数值过大导致计算结果不精确,可以采用double类型数字存储中间值,且当k>n-k时,将k转换为n-k计算。

一段实现此方法的Java代码如下:

import java.util.ArrayList;
import java.util.List;

/**
 * 功能说明:LeetCode 119 - Pascal‘s Triangle II
 * 开发人员:Tsybius2014
 * 开发时间:2015年8月14日
 */
public class Solution {
    
    /**
     * 获取帕斯卡三角形的指定行
     * @param rowIndex 行数
     * @return
     */
    public List<Integer> getRow(int rowIndex) {
        int n = rowIndex + 1;
        ArrayList<Integer> resultList = new ArrayList<Integer>();
        for (int k = 1; k <= n; k++) {
            resultList.add(C(n - 1, k - 1));
        }
        return resultList;
    }
    
    /**
     * 求组合数 C(n,k) = (n(n-1)(n-2)...(n-k+1))/(k(k-1)(k-2)...1)
     * @param n C(n,k)中的n
     * @param k C(n,k)中的k
     * @return 组合数
     */
    private int C(int n, int k) {
        if (k > n - k) {
            k = n - k;
        }
        double numerator = 1.0;
        double denominator = 1.0;
        for (int i = 0; i < k; i++) {
            numerator *= (n - i);
            denominator *= (k - i);
        }
        return (int)(numerator / denominator + 0.5);
    }
}

需要注意的是,因为组合数C(n,k)在k=1到k=n的循环过程中计算出的值是对称的,为了减少计算量,只需要计算最多n/2+1次组合数就可以了。

一个更好的办法是:

public List<Integer> getRow(int rowIndex) {
    int n = rowIndex + 1;
    ArrayList<Integer> resultList = new ArrayList<Integer>();
    if (n % 2 == 1) {
        resultList.add(C(n - 1, n / 2));
    }
    for (int k = n / 2; k > 0; k--) {
        resultList.add(0, C(n - 1, k - 1));
        resultList.add(C(n - 1, k - 1));
    }
    return resultList;
}

END

时间: 2024-10-13 04:38:17

LeetCode:Pascal‘s Triangle II - 帕斯卡三角形2的相关文章

119 Pascal&#39;s Triangle II 帕斯卡三角形 II Pascal&#39;s Triangle II

给定一个索引 k,返回帕斯卡三角形(杨辉三角)的第 k 行.例如,给定 k = 3,则返回 [1, 3, 3, 1].注:你可以优化你的算法到 O(k) 的空间复杂度吗?详见:https://leetcode.com/problems/pascals-triangle-ii/description/ class Solution { public: vector<int> getRow(int rowIndex) { vector<int> res(rowIndex+1); res

Pascal&#39;s Triangle II(帕斯卡三角形)

Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 杨辉三角形,西方称为帕斯卡三角形 杨辉三角 1.每行数字左右对称,由1开始逐渐变大,然后变小,回到1. 2.第n行的数字个数为n个. 3.第n行数

LeetCode——Pascal&#39;s Triangle II

Description: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. public class Solution { public List<Integer> getRow(int rowIndex) { List<List<Integer>> list = new ArrayList<List&

LeetCode: Pascal&#39;s Triangle II 解题报告

Pascal's Triangle II Total Accepted: 19384 Total Submissions: 63446 My Submissions Question SolutionGiven an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3,3,1]. Note:Could you optimize your algorithm to us

(LeetCode)Pascal&#39;s Triangle II --- 杨辉三角进阶(滚动数组思想)

Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? Subscribe to see which companies asked this question 解题分析: 此处有空间的限制,因此不能正

LeetCode Pascal&#39;s Triangle II (杨辉三角)

题意:给出杨辉三角的层数k,返回最后一层.k=0时就是只有一个数字1. 思路:滚动数组计算前一半出来,返回时再复制另一半.简单但是每一句都挺长的. 1 class Solution { 2 public: 3 vector<int> getRow(int rowIndex) { 4 if(rowIndex==0) return vector<int>(1,1); //0和1特殊处理 5 if(rowIndex==1) return vector<int>(2,1); 6

LeetCode: Pascal&#39;s Triangle II [119]

[题目] Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? [题意] 给定行索引k, k从0开始,返回该索引指向的杨辉三角的行 要求只能使用O(k)的额外空间 [思路] 申请两个k+1大小的数组,

LeetCode 119 Pascal&#39;s Triangle II(帕斯卡三角形II)(vector、数学公式)(*)

翻译 给定一个索引K,返回帕斯卡三角形的第K行. 例如,给定K=3, 返回[1,3,3,1]. 注释: 你可以改进你的算法只用O(k)的额外空间吗? 原文 Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra sp

[leetcode] 2. Pascal&#39;s Triangle II

我是按难度往下刷的,第二道是帕斯卡三角形二.简单易懂,题目如下: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 就是输入k然后输出第k行帕斯卡三角[其实我一直把它叫杨辉三角]. 我这边思路是拿