今天发现这个帕斯卡三角形和杨辉三角形好像是一个东东。所以好像还挺好做得,于是决定来做一下。
第一个思路是利用那个排列组合,因为杨辉三角形的每行其实就是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;
}
终于通过啦~大功告成~哦也