作者:小迅
链接: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。