个人笔记博客:java的笔记
题目一描述:
给定一个整数,求出n行杨辉三角的前n排的数,
例如:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
题目链接
题目一分析:
之前有一个使用递归求解杨辉三角的做法,每一行的第一个元素和最后一个元素是1,其余元素是其肩膀上元素的和,每行有K个元素。因此求当前元素时先求得上一行元素。
代码如下:
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(numRows==0)return res;
//外部循环表示当前的元素为第i行
for(int i=1;i<=numRows;i++){
List<Integer> list = new ArrayList();
//内部循环表示当前第i行的第j个元素
for(int j=1;j<=i;j++){
if(j==1||j==i) list.add(1);
else{
//取上一行的当前元素头顶的元素
int sum = res.get(i-2).get(j-2)+res.get(i-2).get(j-1);
list.add(sum);
}
}
res.add(list);
}
return res;
}
}
题目二描述:
杨辉三角求第k行元素
输入: 3
输出: [1,3,3,1]
题目二分析:
求第k行元素,本想使用递归函数进行,测试时出现了超时,因此找到了杨辉三角计算一行的数学公式,效果并不是很好,使用上面的方法进行计算所有行的元素,把最后一行返回即可,这种方式出现关于阶乘的问题在一下进行讨论。
代码如下:
import java.math.BigInteger;
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> res = new ArrayList<>();
if (rowIndex == 0 || rowIndex == 1) {
res.add(1);
if (rowIndex == 1)
res.add(1);
return res;
}
for (int i = 0; i <= rowIndex; i++) {
if (i == 0 || i == rowIndex)
res.add(1);
else {
Integer sum = Integer.valueOf(
String.valueOf(jiecheng4(rowIndex).divide(jiecheng4(i).multiply(jiecheng4(rowIndex - i)))));
res.add(sum);
}
}
return res;
}
// 计算阶乘,BigInteger类型,杨辉三角每一行元素的值为K次多项式的饮食分解
public BigInteger jiecheng4(int n) {
if (n == 1)
return BigInteger.valueOf(1);
else
return jiecheng4(n - 1).multiply(BigInteger.valueOf(n));
}
}
阶乘计算:
根据int类型计算阶乘:
// 最多计算到13的阶乘
public static int jiecheng(int n) {
if (n == 1)
return 1;
else
return n * jiecheng(n - 1);
}
由于int类型是4字节长度,因此计算范围有限
根据long类型计算阶乘:
// 最多计算到20的阶乘
public static long jiecheng2(int n) {
if (n == 1)
return 1l;
else
return n * jiecheng2(n - 1);
}
使用BigInteger进行计算阶乘
public static BigInteger jiecheng3(int n) {
if (n == 1)
return BigInteger.valueOf(1);
else
return jiecheng3(n - 1).multiply(BigInteger.valueOf(n));
}