资讯专栏INFORMATION COLUMN

[Leetcode] Pascal's Triangle 杨辉三角形

Berwin / 734人阅读

摘要:迭代法复杂度时间空间思路简单的按照杨辉三角形的规则计算就行了。代码加入第一个加入中间的数加入最后一个逆序相加法复杂度时间空间思路同样用迭代的方法,根据上一层的值算下一层,不过这里每一层都在同一个上操作。

Pascal"s Triangle I

Given numRows, generate the first numRows of Pascal"s triangle.

For example, given numRows = 5, Return

[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]
迭代法 复杂度

时间 O(N) 空间 O(k^2)

思路

简单的按照杨辉三角形的规则计算就行了。

代码
public class Solution {
    public List> generate(int numRows) {
        List> res = new ArrayList>();
        if(numRows <= 0) return res;
        List one = new ArrayList();
        one.add(1);
        res.add(one);
        for(int i = 1; i < numRows; i++){
            List line = new ArrayList();
            // 加入第一个1
            line.add(1);
            // 加入中间的数
            for(int j = 1; j < i; j++){
                line.add(res.get(i-1).get(j-1) + res.get(i-1).get(j));
            }
            // 加入最后一个1
            line.add(1);
            res.add(line);
        }
        return res;
    }
}
Pascal"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?

逆序相加法 复杂度

时间 O(N) 空间 O(k)

思路

同样用迭代的方法,根据上一层的值算下一层,不过这里每一层都在同一个List上操作。如果我们从后向前计算,而且每次计算都用到上一个位置的数的话,我们会重复计算好几次,导致结果错误。这里的技巧在于从后向前计算,并且每次计算用当前位置的值和上一位置的值,来更新当前位置的值。最后再在后面加个1,就是这一层的结果了。

代码
public class Solution {
    public List getRow(int k) {
        List line = new ArrayList();
        // 加入第一个1
        line.add(1);
        if(k <= 0) return line;
        for(int i = 1; i <= k; i++){
            // 计算j+1位置的值,是根据j位置的值和j+1位置的值得到的,相当于往后位移一位
            for(int j = line.size() - 2; j >= 0; j--){
                line.set(j + 1, line.get(j) + line.get(j + 1));
            }
            // 加上最后一个1
            line.add(1);
        }
        return line;
    }
}
公式法 复杂度

时间 O(K) 空间 O(1)

思路

更“暴力”的方法,是直接使用公式,对于第k(k>=1)层下标为i(i>=0)的位置,数字应该为num[i-1] * (k - i) / i,由于这个乘法可能溢出,我们用一个long型临时变量将其存起来。

注意

rowIndex是0开始的,公式中k是1开始的

代码
public class Solution {
    public List getRow(int rowIndex) {
        // rowIndex是0开始的,我们将它加1,得到k
        int k = rowIndex + 1;
        ArrayList line = new ArrayList();
        line.add(1);
        long tmp = 1;
        for(int i = 1; i < k; i++){
            // 使用公式 上一个数乘以(k-i)再除以i
            tmp = tmp * (k - i) / i;
            line.add((int)tmp);
        }
        return line;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64596.html

相关文章

  • Leetcode 118&119 Pascal&#039;s Triangle

    摘要:首先要对特殊情况进行处理小于等于的情况。然后循环,每一次产生一个,个有个元素,每个的第一个和第个元素都是对于中间的那些元素,则找出前一个的对应位置的两个元素加和即可得到。这一道题只要求返回形式的一行的元素即可。 118 Pascals Triangle 题目详情 Given numRows, generate the first numRows of Pascals triangle....

    laznrbfe 评论0 收藏0
  • leetcode # 118:Pascal&#039;s Triangle 杨辉

    摘要:杨辉三角给定一个非负整数,生成杨辉三角的前行。在杨辉三角中,每个数是它左上方和右上方的数的和。另外可以在内层循环加判断在不等于时才加上,这样可省略代码段,但是这个会在每次进入第一次循环后判断一次。本着减少资源消耗的原则,应当提到外面。 118:Pascals Triangle 杨辉三角 Given a non-negative integer numRows, generate the...

    CKJOKER 评论0 收藏0
  • leetcode # 118:Pascal&#039;s Triangle 杨辉

    摘要:杨辉三角给定一个非负整数,生成杨辉三角的前行。在杨辉三角中,每个数是它左上方和右上方的数的和。另外可以在内层循环加判断在不等于时才加上,这样可省略代码段,但是这个会在每次进入第一次循环后判断一次。本着减少资源消耗的原则,应当提到外面。 118:Pascals Triangle 杨辉三角 Given a non-negative integer numRows, generate the...

    gggggggbong 评论0 收藏0
  • LeetCode 118:杨辉角 II Pascal&#039;s Triangle II

    摘要:公众号爱写作者爱写给定一个非负索引,其中,返回杨辉三角的第行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例输入输出进阶你可以优化你的算法到空间复杂度吗解题思路和之前写的那篇号杨辉三角基本类似。 公众号:爱写bug(ID:icodebugs)作者:爱写bug 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。 Given a non-negative index...

    KaltZK 评论0 收藏0
  • LeetCode 118:杨辉角 II Pascal&#039;s Triangle II

    摘要:公众号爱写作者爱写给定一个非负索引,其中,返回杨辉三角的第行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例输入输出进阶你可以优化你的算法到空间复杂度吗解题思路和之前写的那篇号杨辉三角基本类似。 公众号:爱写bug(ID:icodebugs)作者:爱写bug 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。 Given a non-negative index...

    xiaodao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<