题目描述:
给定一个非负整数 numRows
,生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例:
示例 1:
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1 输出: [[1]]
分析解题思路:
前提:我只是普普通通划水女大学生一枚,并不会什么巧妙的解题方法,能够看懂并且有自己的理解就是我的水平啦~
将三角形左对齐,只是视觉上,其实还是三角形,并不影响计算。
对齐后,如下图:
1.首先可以看出,第几行就会有几个元素,并且每一行第一个元素和最后一个元素都是1
2.从第三行开始除了收尾位置元素为1,其余的元素都是上一行相应位置上的元素和这个元素左边紧邻的第一个元素之和求得的
3.最后,,我们可以明白,每一行的元素都是根据上一行的元素求得的
4.看到答案的形式,[[]],我们想到,如果是Python的话,应该用列表,列表中的每一个元素又是以列表的形式出现的;如果是java的话,我们应该想到集合,因为在从一开始我们并不能给定数组的从长度,而数组在定义时就要给出确切的长度,用ArrayList集合即可,我们可以认为它是长度可变的数组
Python代码实现:
class Solution(object):
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
triangle=[] #创建一个空的列表,当将每一行元素都进行赋值以后最后会形成杨辉三角
#外层循环用于控制三角形的行数
for i in range(numRows):
row=[None for _ in range(i+1)]#[列表里面有numsRow个None组成]
#当前行的最后一个元素和第一个元素永远都是1
#下面这两行,其实已经为杨辉三角的第一行和第二行元素赋值了
row[0]=1
row[-1]=1
#内层for循环计算每一行的元素的每一个值
#下面这个循环实际上应该是从第三行开始为每一行的元素赋值的
for j in range(1,len(row)-1):
row[j]=triangle[i-1][j-1]+triangle[i-1][j]
#每一行中(除首尾以外的元素)每一个元素等于上一行同一个位置的元素与他左边的第一个元素的和
triangle.append(row)#append()方法在列表的末尾添加元素
return triangle
Java代码实现:
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<>();
for (int i=0;i<numRows;i++){
List<Integer> row = new ArrayList<>();
//因为每一行的元素个数都是等于行数的
for (int j=0;j<=i;j++){
if(j==0||j==i){//这里是为了为每一行的第一个元素和最后一个元素赋值为1的
row.add(1);
}else{
//其他位置的元素就等于上一行相同位置的元素与紧邻的左边第一个元素的和
row.add(triangle.get(i-1).get(j-1)+triangle.get(i-1).get(j));
}
}
triangle.add(row);
}
return triangle;
}
}
反思:看力扣的题目时,首先应该保持一个比较平静的心情,戒骄戒躁,认真分析代码为什么是这样的,我为什么没有想到,第一次看的时候,我没有足够的耐心和信心认为自己能够弄明白,于是花了很长时间也没有看懂,因为眼睛在看可是脑子没看,心也不在这上面,而间隔两天我再次来看,因为保持着一颗愉悦的心情,因为这次没有急躁也没有不耐心,所以才终于看懂了,以后要尽力全心全意投入学习中,不让外界的琐事打扰我本就不多的耐心。