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, ...)确保结果不超过杯子容量。
复制代码
相关推荐
rannn_1111 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer1 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
不会代码的小猴2 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
营养充电站2 小时前
VS Code Git 工作树:解锁多分支并行开发的高效体验
leetcode·决策树·逻辑回归·散列表·模拟退火算法
AI备案指南-满满3 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤3 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝3 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林3 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展
陌诺曦.4 小时前
Python扩展小练习
算法