日拱算法:解两道“杨辉三角”题

举报
掘金安东尼 发表于 2022/08/24 09:07:48 2022/08/24
【摘要】 什么是“杨辉三角”,想必大家并不陌生~~在「杨辉三角」中,每个数是它左上方和右上方的数的和。本篇带来两道“杨辉三角”题,小冲一波~~题1:给定一个非负整数 numRows, 生成「杨辉三角」的前 numRows 行。示例 1:输入: numRows = 5输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows = 1输出: ...

什么是“杨辉三角”,想必大家并不陌生~~

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

1626927345-DZmfxB-PascalTriangleAnimated2.gif

本篇带来两道“杨辉三角”题,小冲一波~~

题1:给定一个非负整数 numRows 生成「杨辉三角」的前 numRows 行。

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

解题思路

思路简单,把握杨辉三角特点:第0行1个元素,第1行2个元素,第2行3个元素;依此例推

下一行元素和上一行元素的关系是(0计数开始)以第2行第1列的元素2举例,等于上面1+1(上一行同一列加上一行前一列元素)

JavaScript 实现

/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function (numRows) {
  const res = [];
  /**
   let egg=[
    [1], 
    [1, 1], 
    [1, 2, 1], 
    [1, 3, 3, 1], 
    [1, 4, 6, 4, 1]
  ]
  */
  for (let i = 0; i < numRows; i++) {
    // 看上面的例子数组,第0行1个元素,第1行2个元素,第2行3个元素....
    const row = new Array(i + 1).fill(1);
    // 这里j从1开始到row.length-2结束  是因为每一行的第一个和最后一个其实是不需要算的,因为已经默认为1了,只有中间的才需要算
    for (let j = 1; j < row.length - 1; j++) {
      // 看上面的例子数组,以(0计数开始)2行1列的元素2举例,等于上面1+1(上一行同一列及上一行前一列元素)
      row[j] = res[i - 1][j] + res[i - 1][j - 1];
    }
    res.push(row);
  }
  return res;
};

image.png

题2:给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex **行。

示例 1:

输入: rowIndex = 3
输出: [1,3,3,1]
示例 2:

输入: rowIndex = 0
输出: [1]
示例 3:

输入: rowIndex = 1
输出: [1,1]

解题思路

巧用递归:

  • i表示层级(rowIndex),第i层存在i+1个元素
  • j表示当前层级的元素的位置
  • f[i][j] = (f[i - 1][j - 1] || 0) + (f[i - 1][j] || 0)
/**
 * @param {number} rowIndex
 * @return {number[]}
 */
const getRow = function(rowIndex) {
	/**
	 * 递归方程:f[i][j] = (f[i - 1][j - 1] || 0) + (f[i - 1][j] || 0)
	 */

	if (rowIndex === 0) {
		return [1];
	}

	const arr = getRow(rowIndex - 1);

	return Array.from({length: rowIndex + 1})
		.map((_, index) => (arr[index - 1] || 0) + (arr[index] || 0));
};

image.png

OK,以上便是本篇分享~

我是掘金安东尼,输出暴露输入,技术洞见生活,再会~~

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。