LeetCode 799. 香槟塔

LeetCode 799. 香槟塔

题目描述

将玻璃杯摆成金字塔形状,第1层1个杯子,第2层2个,......,第100层100个。

每个杯子容量为1杯香槟。从顶层倒入poured杯香槟,当杯子满时(量≥1),多余香槟等量流入下一层左右两个杯子。

给定pouredquery_rowquery_glass,返回第query_row行第query_glass个杯子的香槟量(范围[0,1])。

思路一:二维数组逐层模拟

算法思想
  • 用二维数组tower[i][j]表示第i行第j个杯子的香槟量(初始为0)。
  • poured倒入顶层:tower[0][0] = poured
  • 从第0行逐行处理到第99行:
    • tower[i][j] > 1,计算溢出量over = tower[i][j] - 1,平分到tower[i+1][j]tower[i+1][j+1],并设置tower[i][j] = 1
    • 若某行无溢出,提前终止。
  • 返回min(1.0, tower[query_row][query_glass])
代码实现(C++)
cpp 复制代码
class Solution {
public:
    double champagneTower(int poured, int query_row, int query_glass) {
        double tower[101][101] = {0.0};
        tower[0][0] = poured;
        for (int i = 0; i < 100; ++i) {
            bool hasOverflow = false;
            for (int j = 0; j <= i; ++j) {
                if (tower[i][j] > 1.0) {
                    double over = tower[i][j] - 1.0;
                    tower[i+1][j]   += over / 2.0;
                    tower[i+1][j+1] += over / 2.0;
                    tower[i][j] = 1.0;
                    hasOverflow = true;
                }
            }
            if (!hasOverflow) break;
        }
        return min(1.0, tower[query_row][query_glass]);
    }
};
复杂度分析
  • 时间复杂度:O(1)(常数级)。
  • 空间复杂度:O(1)(101×101数组)。

思路二:一维滚动数组(空间优化)

算法思想
  • 使用两个一维数组curnext
    • cur表示当前层,初始cur[0] = poured
    • 处理到第query_row - 1行:
      • 清空next
      • cur[j] > 1.0,溢出量over平分到next[j]next[j+1]
      • 交换curnext进入下一层。
  • 返回min(1.0, cur[query_glass])
代码实现(C++)
cpp 复制代码
class Solution {
public:
    double champagneTower(int poured, int query_row, int query_glass) {
        vector<double> cur(101, 0.0), next(101, 0.0);
        cur[0] = poured;
        for (int i = 0; i < query_row; ++i) {
            fill(next.begin(), next.end(), 0.0);
            for (int j = 0; j <= i; ++j) {
                if (cur[j] > 1.0) {
                    double over = cur[j] - 1.0;
                    next[j]   += over / 2.0;
                    next[j+1] += over / 2.0;
                }
            }
            swap(cur, next);
        }
        return min(1.0, cur[query_glass]);
    }
};
复杂度分析
  • 时间复杂度:O(1)(常数级)。
  • 空间复杂度:O(1)(两个长度101的数组)。

总结

  • 二维数组法直观,适合理解;一维滚动数组法空间更优。
  • 两种方法均需用min(1.0, ...)确保结果不超过杯子容量。
复制代码
相关推荐
wuweijianlove2 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong2 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志2 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光3 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_113 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg3 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒4 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾4 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
SatVision炼金士4 小时前
合成孔径雷达干涉测量(InSAR)沉降监测算法体系
算法