一、杨辉三角
题目描述
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
递归解法
import java.util.Scanner;
//利用递归算法来实现
/**
* 关键在于一头一尾为1,每一行元素的个数等于行数
* 中间的元素的该列所对应的上一行的该列元素和前面一个元素的和
*/
public class Yanghuisanjiao {
public static int generate(int row,int col){
//如何使一头一尾以及第一个元素为1
if(col==row||col==1||row==1) return 1;
//否则中间元素的上一行的两个元素相加 列数相同以及列数减一的元素
else return generate(row-1,col-1)+generate(row-1,col);
}
public static void main(String[] args) {
int numRows=0;
Scanner input=new Scanner(System.in);
numRows=input.nextInt();
for (int i = 1; i <=numRows; i++) {
for (int j = 1; j <=i ; j++) {
System.out.print(generate(i,j)+" ");
}
System.out.print("\n");
}
}
}
动态规划解法
import java.util.Scanner;
/**
* 使用动态规划
*/
public class Yhsj {
public static void main(String[] args) {
int numRows=0;
Scanner input=new Scanner(System.in);
numRows=input.nextInt();
int nums[][]=new int[numRows][];
for (int i = 0; i <numRows; i++) {
nums[i]=new int[i+1];//为每一行的元素开辟空间
for (int j = 0; j <=i; j++) {
if(i==0||j==i||j==0){
nums[i][j]=1;//为1的情况
}else {
nums[i][j]=nums[i-1][j]+nums[i-1][j-1];//等于两个元素之和
}
}
}
//输出二维数组
for (int k = 0; k < numRows; k++) {
for (int t = 0; t <=k; t++) {
System.out.print(nums[k][t]+" ");
}
System.out.print("\n");
}
}
}
力扣
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
int nums[][]=new int[numRows][];
for (int i = 0; i <numRows; i++) {
nums[i]=new int[i+1];//为每一行的元素开辟空间
for (int j = 0; j <=i; j++) {
if(i==0||j==i||j==0){
nums[i][j]=1;
}else {
nums[i][j]=nums[i-1][j]+nums[i-1][j-1];
}
}
}
for(int i=0;i<nums.length;i++){
List<Integer> tmp=new ArrayList<>();
for(int j=0;j<nums[i].length;j++){
if(nums[i][j]==0) break;
tmp.add(nums[i][j]);
}
result.add(new ArrayList<>(tmp));
}
return result;
}
}
二、杨辉三角2.0
题目描述
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
输入: rowIndex = 3
输出: [1,3,3,1]
动态规划解法
import java.util.Scanner;
/**
* 使用动态规划
*/
public class Yhsj_2 {
public static void main(String[] args) {
int rowIndex=0;
Scanner input=new Scanner(System.in);
rowIndex=input.nextInt();
int nums[][]=new int[rowIndex+1][];
for (int i = 0; i <rowIndex+1; i++) {
nums[i]=new int[i+1];//为每一行的元素开辟空间
for (int j = 0; j <=i; j++) {
if(i==0||j==i||j==0){
nums[i][j]=1;
}else {
nums[i][j]=nums[i-1][j]+nums[i-1][j-1];
}
}
}
for (int t = 0; t <=rowIndex; t++) {
System.out.print(nums[rowIndex][t]+" ");
}
}
}
力扣
class Solution {
public List<Integer> getRow(int rowIndex) {
int nums[][]=new int[rowIndex+1][];
for (int i = 0; i <rowIndex+1; i++) {
nums[i]=new int[i+1];//为每一行的元素开辟空间
for (int j = 0; j <=i; j++) {
if(i==0||j==i||j==0){
nums[i][j]=1;
}else {
nums[i][j]=nums[i-1][j]+nums[i-1][j-1];
}
}
}
List<Integer> result=new ArrayList<>();
for(int j=0;j<nums[rowIndex].length;j++){
if(nums[rowIndex][j]==0) break;
result.add(nums[rowIndex][j]);
}
return result;
}
}