杨辉三角:性质和代码,求解《118. 杨辉三角》《119. 杨辉三角 II》和《2221. 数组的三角和》

2022-04-11 15:14:41

什么是杨辉三角,杨辉三角的性质,求解《118. 杨辉三角》《119. 杨辉三角 II》和《2221. 数组的三角和》

杨辉三角,帕斯卡三角形构成动图

杨辉三角形(帕斯卡三角形)

例题

生成杨辉三角形

118. 杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。

答案

var generate = function(numRows) {
  const r = Array.from({length: numRows}, (_, i) => new Uint32Array(i + 1))
  for (let i = 0; i < numRows; i++) {
    r[i][0] = r[i][i] = 1
    for (let j = 1; j <= i >> 1; j++) {
      r[i][j] = r[i][i - j] = r[i- 1][j - 1] + r[i - 1][j]
    }
  }
  return r
};

119. 杨辉三角 II

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。

答案

递推
var getRow = function(rowIndex) {
  const r = Array.from({length: rowIndex + 1}, (_, i) => new Uint32Array(i + 1))
  for (let i = 0; i <= rowIndex; i++) {
    r[i][0] = r[i][i] = 1
    for (let j = 1; j <= i >> 1; j++) {
      r[i][j] = r[i][i - j] = r[i - 1][j - 1] + r[i - 1][j]
    }
  }
  return r[rowIndex]
};
优化 · 滚动数组
var getRow = function(rowIndex) {
  const cur = new Uint32Array(rowIndex + 1)
  let prev = []
  for (let i = 0; i <= rowIndex; i++) {
    cur[0] = cur[i] = 1
    for (let j = 1; j <= i >> 1; j++) {
      cur[j] = cur[i - j] = prev[j - 1] + prev[j]
    }
    prev = cur.slice()
  }
  return cur
};
var getRow = function(rowIndex) {
  let prev = []
  for (let i = 0; i <= rowIndex; i++) {
    const cur = new Uint32Array(rowIndex + 1)
    cur[0] = cur[i] = 1
    for (let j = 1; j <= i >> 1; j++) {
      cur[j] = cur[i - j] = prev[j - 1] + prev[j]
    }
    prev = cur
  }
  return prev
};
优化 · 单数组
var getRow = function(rowIndex) {
  const r = new Uint32Array(rowIndex + 1)
  r[0] = 1
  for (let i = 0; i <= rowIndex; i++) {
    for (let j = i; j > 0; j--) {
      r[j] += r[j - 1]
    }
  }
  return r
};

2221. 数组的三角和

给你一个下标从 0 开始的整数数组 nums ,其中 nums[i] 是 0 到 9 之间(两者都包含)的一个数字。 nums 的 三角和 是执行以下操作以后最后剩下元素的值: nums 初始包含 n 个元素。如果 n == 1 ,终止 操作。否则,创建 一个新的下标从 0 开始的长度为 n - 1 的整数数组 newNums 。 对于满足 0 <= i < n - 1 的下标 i ,newNums[i] 赋值 为 (nums[i] + nums[i+1]) % 10 ,% 表示取余运算。 将 newNums 替换 数组 nums 。 从步骤 1 开始 重复 整个过程。 请你返回 nums 的三角和。

答案

var triangularSum = function(nums) {
  let n = nums.length
  while (--n) {
    for (let i = 0; i < n; i++) {
      nums[i] = (nums[i] + nums[i + 1]) % 10
    }
  }
  return nums[0]
};


双倒序遍历、贪心算法:求解《31. 下一个排列》
两次倒序遍历,贪心算法,求解《31. 下一个排列》
递归公式:求解《396. 旋转函数》
用递推归纳法,求解《396. 旋转函数》
动态规划、记忆化递归:求解《131. 分割回文串》《剑指 Offer II 086. 分割回文子字符串》《132. 分割回文串 II》《剑指 Offer II 094. 最少回文分割》《1278. 分割回文串 III》
用动态规划、记忆化递归求解《131. 分割回文串》《剑指 Offer II 086. 分割回文子字符串》《132. 分割回文串 II》《剑指 Offer II 094. 最少回文分割》和《1278. 分割回文串 III》