LeetCode 记录-799. 香槟塔
我的解法
思路
我的思路是想用归纳总结的方法来找到每层的规律,但是没找到。
官方解法 1: 模拟
思路
官方的思路就是模拟倒香槟的整个过程。首先将所有 poured 杯香槟全部倒到的香槟杯中。当有溢出时,再将溢出的部分平均倒到下一层的相邻的两个杯子中。根据这个思路,可以求出每一层的每一个杯子中的香槟体积。因为我们只需要返回 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]);
};
复杂度分析
时间复杂度
,使用了两层for循环。
空间复杂度
,使用滚动数组实现的空间复杂度是。