【leetcode】Pascal's Triangle II(Java)

今天发现这个帕斯卡三角形和杨辉三角形好像是一个东东。所以好像还挺好做得,于是决定来做一下。

第一个思路是利用那个排列组合,因为杨辉三角形的每行其实就是Cxx(行号和列号的系数),才开始编了个程序,到了13的时候出错了,所以把数据类型改成了long

public List<Integer> getRow(int rowIndex) {
        int[] num=new int[rowIndex+1];
        num[0]=1;
        int result=0,j=1;
        long up=1L,down=1L;
        for (int i=rowIndex;i>0;i-- ) {
        	up=up*i;
        	down=down*j;
        	result=(int)(up/down);
        	System.out.println(up+","+down+","+result);
        	num[j]=result;
        	j++;
        	}
        	List<Integer> list = new ArrayList<Integer>(num.length);
        	for (int i=0;i<=rowIndex;i++) {
        		list.add(num[i]);
        	}
        	return list;
        }

然后这个程序跑了21行也不行了,原因肯定还是数据太大溢出了呗,所以再进行一下改进,就是只生成前一半,然后用对称的方法生成后一半:

public List<Integer> getRow(int rowIndex) {
        int[] num=new int[rowIndex+1];
        num[0]=1;
        int result=0,j=1;
        long up=1L,down=1L;
        for (int i=rowIndex;i>rowIndex/2;i-- ) {
        	up=up*i;
        	down=down*j;
        	result=(int)(up/down);
        	// System.out.println(up+","+down+","+result);
        	num[j]=result;
        	j++;
        	}
        	for (int i=rowIndex;i>=j ;i-- ) {
        		num[i]=num[rowIndex-i];
        	}
        	List<Integer> list = new ArrayList<Integer>(num.length);
        	for (int i=0;i<=rowIndex;i++) {
        		list.add(num[i]);
        	}
        	return list;
        }

这个程序在测试29的时候还是出错了,看来这个方法不能用了啊。得彻底换一个方法才行,那就只有从第一行一行一行往下推咯,内个总不会出现溢出的问题吧。

public List<Integer> getRow(int rowIndex) {
        int[][] num=new int[rowIndex+1][rowIndex+1];
        for (int i=0;i<=rowIndex ;i++) {
        	num[i][0]=1;
        	num[i][i]=1;
        }
        for (int i=2;i<=rowIndex ;i++ ) {
        	for (int j=1;j<rowIndex ;j++ ) {
        		num[i][j]=num[i-1][j-1]+num[i-1][j];
        	}
        }
        	List<Integer> list = new ArrayList<Integer>(rowIndex+1);
        	for (int i=0;i<=rowIndex;i++) {
        		list.add(num[rowIndex][i]);
        	}
        	return list;
        }

终于通过啦~大功告成~哦也


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值