杨辉三角

杨辉三角1

输入: 5

输出:

[

     [1],

    [1,1],

   [1,2,1],

  [1,3,3,1],

 [1,4,6,4,1]

]

 

 

import java.util.*;
public class Solution {
    /**
     *
     * @param numRows int整型
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> generate (int numRows) {
       ArrayList<ArrayList<Integer>> trangle=new ArrayList<>();//定义三角矩阵
         if(numRows==0) return trangle;
         //trangle定义类型及第一个元素为1
         trangle.add(new ArrayList<>());
         trangle.get(0).add(1);
         //
        for(int i=1;i<numRows;i++){
            ArrayList<Integer> row=new ArrayList<>();//定义当前行
            ArrayList<Integer> prerow=trangle.get(i-1);//定义前一行
            //第i(i>1)行第一个元素
            row.add(1);
            //其他的元素就是上+左上
            for(int j=1;j<i;j++){// j一定小于i
                row.add(prerow.get(j-1)+prerow.get(j));
            }
            //每行最后一个元素为1
            row.add(1);
            trangle.add(row);
        }
        return trangle;
        }
    }

杨辉三角2

给出一个索引k,返回杨辉三角的第k行

例如,k=3,

返回[1,3,3,1].

备注:

你能将你的算法优化到只使用O(k)的额外空间吗?

法一:暴力算法

解题思路:

1.定义cur(当前值),pre(保存上一层的值)

2.遍历第一列和对角线即为1

3.递归剩下的值为上+左,cur.add()

4.更新pre记录,记录以前的值

import java.util.*;
public class Solution {
    /**
     *
     * @param rowIndex int整型
     * @return int整型ArrayList
     */
    public ArrayList<Integer> getRow (int rowIndex) {
        ArrayList<Integer>cur=new ArrayList<>();
        ArrayList<Integer> pre=new ArrayList<>();
        for(int i=0;i<=rowIndex;i++){
            cur=new ArrayList<>();
            for(int j=0;j<=i;j++){
                if(j==0||j==i){
                    cur.add(1);
                } 
                else{
                    cur.add(pre.get(j-1)+pre.get(j));
                }
            }
            pre=cur;
        }
        return cur;
    }
}

法二:

 

解题思路:(pre 的 List 省去,cur每次不去新建 List,而是把cur当作pre。)

1.定义cur(当前值),pre=1

2.每次循环以前,第一列为1

3.temp临时保存当前值,更新当前j的时候,就把之前j的信息覆盖掉了。而更新 j + 1 的时候又需要之前j的信息,所以在更新前,我们需要一个变量把之前j的信息保存起来

4.递归cur.set(),改变j下标的值即为上+左

5.更新pre记录,记录以前的值

6.每次循环以后,最后一列为1

import java.util.*;
public class Solution {
    /**
     *
     * @param rowIndex int整型
     * @return int整型ArrayList
     */
    public ArrayList<Integer> getRow (int rowIndex) {
        ArrayList<Integer>cur=new ArrayList<>();
        //ArrayList<Integer> pre=new ArrayList<>();
        int pre=1;
        //第一列为1
        cur.add(1);
        for(int i=1;i<=rowIndex;i++){
            for(int j=1;j<i;j++){
                 int temp=cur.get(j);//temp临时保存
                 cur.set(j,pre+cur.get(j));//相当于cur.get(j-1)+cur.get(j)
                 pre=temp;
                }
            //最后一列
            cur.add(1);
            }
        return cur;
    }

法三:

优化:倒着进行,这样就不会存在覆盖的情况了

解题思路:

1.定义cur(当前值),pre=1

2.每次循环以前,第一列为1

3.从后向前进行递归,更新完j的信息后,虽然把j之前的信息覆盖掉了。但是下一次我们更新的是j - 1,需要的是j - 1和j - 2 的信息,j信息覆盖就不会造成影响了。

4.递归cur.set(),改变j下标的值即为上+左

5.每次循环以后,最后一列为1

import java.util.*;
public class Solution {
    /**
     *
     * @param rowIndex int整型
     * @return int整型ArrayList
     */
    public ArrayList<Integer> getRow (int rowIndex){
        ArrayList<Integer>cur=new ArrayList<>();
        //ArrayList<Integer> pre=new ArrayList<>();
        int pre=1;
        //第一列为1
        cur.add(1);
        for(int i=1;i<=rowIndex;i++){
            for(int j=i-1;j>0;j--){
                 cur.set(j,cur.get(j-1)+cur.get(j));
                }
            //最后一列
            cur.add(1);
            }
        return cur;
    }
    }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值