Leetcode119 Pascal's Triangle II

原题目

Given a non-negative index k where k ≤ 33, return the kth 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?

中文题意

杨辉三角问题,就是每一行中每个元素为头顶两个元素之和,每一行的第一位和最后一位为1。

分析

1.从数学的角度,发现每个元素的数学计算规律,然后使用数学方法计算特定位置上的值;

2.如果不使用纯数学方法,从第0行开始逐层向下推导,那么可以计算出前面每行的分布,最后得到所求行的元素。

java实现

方法一:从第0行开始逐层求出每层的元素,然后求出指定行的元素信息。

使用一个集合ori来存储每行的信息,这样下面一行会覆盖前面一行的信息。在逐个向ori中添加计算出的新结果时,会覆盖前面一层在该位置的信息,那么使用pre记录被覆盖的元素值,作为求下一个结果的和因子。

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> ori = new ArrayList<Integer>();
        ori.add(new Integer(1));
        
        if(rowIndex == 0){
            return ori;
        }
        
        int pre = 0;
        int curr = 0;
        int i = 1;
        while(i <= rowIndex){
            pre = ori.get(0).intValue();
            for(int j = 1; j< i; j++){
                curr = ori.get(j).intValue();//当前位置的元素未被处理,作为下一个元素的和因子
                ori.set(j,new Integer(pre+curr));//当前位置的元素被处理,为头顶两个元素的和
                pre = curr;//将当前位置原来的值赋值给pre,作为记录。
                
            }
            ori.add(new Integer(1));
            i++;
        }  
        return ori;
    }
}

方法二:创建新的集合来存储每一行的值,下一行的值使用前一行对应的数组来计算。

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> ori = new ArrayList<Integer>();
        List<Integer> now;
        
        ori.add(new Integer(1));
        if(rowIndex == 0){
            return ori;
        }else if(rowIndex == 1){
            ori.add(new Integer(1));
            return ori;
        }else{
            ori.add(new Integer(1));
            int count = 1;
            for(int i = 2; i <= rowIndex;i++){
                now = new ArrayList<Integer>();
                now.add(new Integer(1));
                for(int j = 1; j < i ;j++){
                    now.add(ori.get(j-1)+ori.get(j));
                }
                now.add(new Integer(1));
                ori = now;
                
            }
            
            return ori;
        }
        
        //return ori;
    }
}

方法三:使用数学的计算公式。

第n行第k个位置的值为:C(n,k),n从0开始,k从0开始。

class Solution {
    public List<Integer> getRow(int rowIndex) {
        List<Integer> ori = new ArrayList<Integer>();
		double temp = 1;
		int n = rowIndex;

		ori.add(new Integer(1));
		if(rowIndex == 0){
			return ori;
		}

		if(rowIndex > 1){
			for(int i = 1;i < rowIndex ;i++){
				temp = temp * (n--);
				temp = temp /i;
				ori.add(new Integer((int)temp));
			}
		}

		ori.add(new Integer(1));
		return ori;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值