LeetCode 记录-799. 香槟塔

202 阅读1分钟

LeetCode 记录-799. 香槟塔

我的解法

思路

image.png

我的思路是想用归纳总结的方法来找到每层的规律,但是没找到。


官方解法 1: 模拟

思路

官方的思路就是模拟倒香槟的整个过程。首先将所有 poured 杯香槟全部倒到row=0row=0的香槟杯中。当有溢出时,再将溢出的部分平均倒到下一层的相邻的两个杯子中。根据这个思路,可以求出每一层的每一个杯子中的香槟体积。因为我们只需要返回 query_row 行,query_glass 杯中的体积,所以我们只需要求得第 query_row 行的所有香槟体积,然后取第 query_glass 个杯子的体积,并与 1 求最小值返回(因为当前行可能还是存在溢出的情况)。

代码

/**
 * @param {number} poured
 * @param {number} query_row
 * @param {number} query_glass
 * @return {number}
 */
var champagneTower = function (poured, query_row, query_glass) {
  let row = [poured];
  for (let i = 1; i <= query_row; i++) {
    const nextRow = new Array(i + 1).fill(0);
    for (let j = 0; j < i; j++) {
      const volume = row[j];
      if (volume > 1) {
        nextRow[j] += (volume - 1) / 2;
        nextRow[j + 1] += (volume - 1) / 2;
      }
    }
    row = nextRow;
  }
  return Math.min(1, row[query_glass]);
};

复杂度分析

时间复杂度

O(query_row2)O(query\_row^2),使用了两层for循环。

空间复杂度

O(query_row)O(query\_row),使用滚动数组实现的空间复杂度是O(query_row)O(query\_row)