杨辉三角的解法

Posted 易小顺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杨辉三角的解法相关的知识,希望对你有一定的参考价值。

杨辉三角的解题方法

题目:给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。

解法一

 按照杨辉三角的定义,将每一层的数据都进行计算保存,然后返回最后一层的数据据即可,需要第 N 层就需要一个 N 维的二维数组。其中 第零层第一层 是比较特殊的,需要进行单独的定义,其余层按照规则进行生成。

class Solution 
    public List<Integer> getRow(int rowIndex) 
        List<List<Integer>> ret = new ArrayList();
        if(rowIndex >= 0) 
            List<Integer> ans = new ArrayList();
            ans.add(1);
            ret.add(ans);
        
        if(rowIndex >= 1) 
            List<Integer> ans = new ArrayList();
            ans.add(1);
            ans.add(1);
            ret.add(ans);
        
        for(int i = 2; i <= rowIndex; i++) 
            List<Integer> temp = ret.get(i - 1);
            List<Integer> ans = new ArrayList();
            ans.add(1);
            for(int j = 0; j + 1 < temp.size(); j++) 
                ans.add(temp.get(j) + temp.get(j + 1));
            
            ans.add(1);
            ret.add(ans);
        
        return ret.get(rowIndex);
    

解法二

 解法一每层都重新开辟空间来进行存储,浪费了大量的内存空间。观察整个计算的流程,其实只用到了上一层的数据和下一层的存储空间,也就是只需要两层的空间即可完成最终数据的计算。也就是可以设计一个滚动的两层空间来进行计算存储,区分上一层和当前的计算层,上一层用 减一模二 来代替下标,当前计算层直接 模二

 一维数组的大小的话直接设置为输出层的长度,也就是 rowIndex + 1

class Solution 
    public List<Integer> getRow(int rowIndex) 
        int[][] ret = new int[2][rowIndex + 1];
        ret[0][0] = 1;
        for(int i = 1; i <= rowIndex; i++) 
            int preIndex = (i - 1) % 2, index = i % 2;
            ret[index][0] = 1;
            for(int j = 1; j <= i; j++) 
                ret[index][j] = ret[preIndex][j - 1] + ret[preIndex][j];
            
        
        return Arrays.stream(ret[rowIndex % 2]).boxed().collect(Collectors.toList());
    

解法三

 再次观察整个图形的成型状况,可以将递推规则换一下思路,在每一层的前面添加一个 1 ,作为新增数据,需要变动的数据范围是除掉前后端点的两个值,更新当前的位置数据为加上下一个位置的值的和,这样只需要一个动态数组即可完成,也可以使用一个定长 rowIndex 数组从后面开始遍历。

class Solution 
    public List<Integer> getRow(int rowIndex) 
        LinkedList<Integer> ret = new LinkedList();
        if(rowIndex >= 0) ret.add(1);
        if(rowIndex >= 1) ret.add(1);
        for(int i = 2; i <= rowIndex; i++) 
            ret.addFirst(1);
            for(int j = 1; j < ret.size() - 1; j++) 
                ret.set(j, ret.get(j) + ret.get(j + 1));
            
        
        return ret;
    

以上是关于杨辉三角的解法的主要内容,如果未能解决你的问题,请参考以下文章

三角函数不等式的解法

杨辉三角(详解)

杨辉三角(详解)

杨辉三角(详解)

运筹学等值线怎么求

汤普森问题正弦定理乱搞解法