杨辉三角解法
方法一(递归):
package org.example;
public class E03PascalTriangle {
private static int element(int i,int j){
if(j==0||i==j){
return 1;
}
return element(i-1,j-1)+element(i-1,j);
}
private static void printSpace(int n,int i){
int num=(n-1-i)*2;
for (int j=0;j<num;j++){
System.out.print(" ");
}
}
public static void print(int n){
for (int i = 0; i < n; i++) {
printSpace(n,i);
for (int j=0;j<=i;j++){
System.out.printf("%-4d", element(i,j));
}
System.out.println();
}
}
public static void main(String[] args) {
//System.out.println(element(4,2));
print(5);
}
}
System.out.printf("%-4d", element(i,j));-左对齐,4d是四个字符串的位置
缺点:时间复杂度高(2的n次幂)
优化思路:使用记忆法,把杨辉三角的值记录下来,使用二维数组(复杂度:n的平方)
package org.example;
public class E03PascalTriangle {
private static int element1(int[][] triangle,int i,int j){
if(triangle[i][j]>0){
return triangle[i][j];
}
if(j==0||i==j){
triangle[i][j]=1;
return 1;
}
triangle[i][j]=element1(triangle,i-1,j-1)+element1(triangle,i-1,j);
return triangle[i][j];
}
private static void printSpace(int n,int i){
int num=(n-1-i)*2;
for (int j=0;j<num;j++){
System.out.print(" ");
}
}
public static void print(int n){
int[][] triangle =new int[n][];
for (int i = 0; i < n; i++) {//行,每次循环行的时候,确定列数
triangle[i]=new int[i+1];//第i行,列数有第i+1列,这样二维数组初始值就都有了
// printSpace(n,i);
for (int j=0;j<=i;j++){
System.out.printf("%-4d", element1(triangle,i,j));
}
System.out.println();
}
}
public static void main(String[] args) {
//System.out.println(element(4,2));
print(5);
}
}
优化2:使用一维数组,也叫动态规划法
public static void createRow(int[] row,int i){
if(i==0){
row[0]=1;
return;
}
for(int j=i;j>0;j--){
row[j]=row[j]+row[j-1];
}
}
public static void print2(int n){
int[] row=new int[n];
for (int i = 0; i < n; i++) {//行,每次循环行的时候,确定列数
createRow(row,i);
// printSpace(n,i);
for (int j=0;j<=i;j++){
System.out.printf("%-4d", row[j]);
}
System.out.println();
}
}