LeetCode·每日一题·799.香槟塔·模拟

作者:小迅
链接:https://leetcode.cn/problems/champagne-tower/solutions/1982607/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-cvdb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

题目

 

示例

 

思路

我们 定义一个二维数组来模拟杯子 ,然后根据题意 进行模拟,如果当前杯子的上一个杯子 到满了 就将剩余的酒分一半给当前杯子,然后根据这个规则,对每一个杯子进行模拟,最后返回需要的位置 ,记得与 1.00 进行比较,如果超过 1.00 就代表满了,就取 1.00

我们进行模拟的过程中可以发现,我们每一层的模拟都只需要 上一层的状态即可,那么记录每一层杯子的状态 可以使用二维数组,也可以使用 滚动数组,因为我们每次都只需要上一层数据就能推导当前层

代码


#define MIN(a, b) ((a) < (b) ? (a) : (b))

double champagneTower(int poured, int query_row, int query_glass) {
    double row[query_row + 2];//记录每一层杯子的状态 使用滚动数组
    int rowSize = 1;
    row[0] = poured;//初始化
    for (int i = 1; i <= query_row; i++) {//枚举每一层
        double nextRow[i + 1];
        for (int j = 0; j <= i; j++) {//初始化
            nextRow[j] = 0.0;
        }
        for (int j = 0; j < rowSize; j++) {//枚举每一个层的每一个元素
            double volume = row[j];//取当前杯子的上一个杯子的状态
            if (volume > 1) {//当上一个杯子满了时
                nextRow[j] += (volume - 1) / 2;//分到当前杯子
                nextRow[j + 1] += (volume - 1) / 2;
            }
        }
        memcpy(row, nextRow, sizeof(double) * (i + 1));//覆盖上一层数据,供下一次用
        rowSize = i + 1;
    }            
    return MIN(1.0, row[query_glass]);
}


作者:小迅
链接:https://leetcode.cn/problems/champagne-tower/solutions/1982607/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-cvdb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值