杨辉三角
题目描述:
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
问题分析:
其实从普通解法上来说,杨辉三角只有一个半公式
第一个:arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
半个: if(j==0 || j==i)
arr[i][j] = 1;
单纯的打印倒是没什么,不过还有很多可以更新可以学习的地方。
代码展示(已验证):
java
// leetcode-java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class generate {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入杨辉三角形的行数: ");
int numRows = input.nextInt();
System.out.println("结果如下:");
System.out.println(Generate(numRows).toString()); //打印字符串
}
//----------------------上面的只是 表示字符串打印输出而已--------------------
public List<List<Integer>> Generate(int numRows) {
List<List<Integer>> list = new ArrayList<>(); // 返回类型
int[][] arr = new int[numRows][numRows]; // 定义二维数组
for(int i=0;i<numRows;i++)
{
ArrayList<Integer> sublist = new ArrayList<>(); // 创建 ArrayList 对象 用来存储每行数据
for(int j=0;j<=i;j++)
{
if(j==0 || j==i)
arr[i][j] = 1;
else
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
sublist.add(arr[i][j]); // 将每行数据 插入其中
}
list.add(sublist); // 将sublist 数据 放入到 list 中
}
return list;
}
}
c语言
//c 语言打印杨辉三角形
#include <stdio.h>
int main()
{
int i,j,n = 0;
int a[100][100] = {0}; // 初始化二维数组
while(n < 1 || n >100) // 对输入的值进行规范
{
printf("请输入要打印的杨辉三角行数>:");
scanf("%d",&n);
}
for(i = 0; i < n ; i++) // 杨辉三角 每行第一个 为1
a[i][0] = 1;
for(i = 1; i < n; i++ )//n 行
{
for(j = 1; j <= i; j++)// 每行有 j 个数字,j<=i
{
a[i][j] = a[i-1][j-1]+a[i-1][j]; // 其实杨辉三角形 就这一个公式
}
}
for(i = 0; i < n; i++)//逐行打印
{
for(j = 0; j <= i; j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
泡泡:
上面的使用的是最普通的解法,我们需要想到的是,循环的时候其实有一半的数据是重复的,如果能把这一部分直接赋值,效果应该会更好