LeetCode日记(香槟塔)第三天
题目如下:
我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1
个玻璃杯, 第二层 有 2
个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟。
从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任何溢出的香槟都会立刻等流量的流向左右两侧的玻璃杯。当左右两边的杯子也满了,就会等流量的流向它们左右两边的杯子,依次类推。(当最底层的玻璃杯满了,香槟会流到地板上)
例如,在倾倒一杯香槟后,最顶层的玻璃杯满了。倾倒了两杯香槟后,第二层的两个玻璃杯各自盛放一半的香槟。在倒三杯香槟后,第二层的香槟满了 - 此时总共有三个满的玻璃杯。在倒第四杯后,第三层中间的玻璃杯盛放了一半的香槟,他两边的玻璃杯各自盛放了四分之一的香槟,如下图所示。
现在当倾倒了非负整数杯香槟后,返回第 i
行 j
个玻璃杯所盛放的香槟占玻璃杯容积的比例( i
和 j
都从0开始)。
示例 1: 输入: poured(倾倒香槟总杯数) = 1, query_glass(杯子的位置数) = 1, query_row(行数) = 1 输出: 0.00000 解释: 我们在顶层(下标是(0,0))倒了一杯香槟后,没有溢出,因此所有在顶层以下的玻璃杯都是空的。示例 2: 输入: poured(倾倒香槟总杯数) = 2, query_glass(杯子的位置数) = 1, query_row(行数) = 1 输出: 0.50000 解释: 我们在顶层(下标是(0,0)倒了两杯香槟后,有一杯量的香槟将从顶层溢出,位于(1,0)的玻璃杯和(1,1)的玻璃杯平分了这一杯香槟,所以每个玻璃杯有一半的香槟。
示例 3:
输入: poured = 100000009, query_row = 33, query_glass = 17 输出: 1.00000
先放代码 :
public double champagneTower(int poured, int query_row, int query_glass) {double []row={poured};//第一行获得的酒的量,假设第一行的杯子足够大全放进去,最后留下一杯的量。for(int i=1;i<=query_row;i++){double nextrow[]=new double[i+1];//第i行有i+1个杯子。nextrow[0]=Math.max(0,(row[0]-1))/2;//每行第一个获得的量是上一行第一个的一半nextrow[i]=Math.max(0,(row[i-1]-1))/2;//每行最后一个获得的量是上一行最后一个的一半。for(int j=1;j<i;j++){nextrow[j]=(Math.max(0,(row[j-1]-1))+Math.max(0,(row[j]-1)))/2;//除了第一个和最后一个外,每个杯子获得的总量是上一层同位号杯子的一半,以及同为号前个杯子的一半}row=nextrow;//将本行变为下一行的上一行;}return Math.min(1,row[query_glass]);}
先解释一下思路吧:
对于除去第一行也就是(0,0)坐标的杯子来说它所获得的酒量是所倒入的量
再对于之后的每一行的来说,除去每一行的第一个以及最后一个是上一行第一个与最后一个传下的一半,其他的杯子都是由上一行同位置的杯子穿一半过来再加上上一行同位置的前一个的一半。那么我们就可以求出每个杯子获得到的酒的总量。
代码解释部分:
假设我们倒入的杯数是5杯
double [ ]row={poured};
这里是对第一行的杯子进行赋值,因为第一行只有一个杯子,我们假设所有杯子都足够大,但是最后只能留下一杯的量,那么对与第一个来说他获得的酒的总量是5,
然后我们留下一杯的量,剩下的流到下面。
到了下一层我们先对第一个杯子与最后一个杯子赋值。
double nextrow[ ]=new double[i+1];//第i行有i+1个杯子。
nextrow[0]=Math.max(0,(row[0]-1))/2;//每行第一个获得的量是上一行第一个的一半
nextrow[i]=Math.max(0,(row[i-1]-1))/2;
//每行最后一个获得的量是上一行最后一个的一半。
创建的新数组容量是本层的杯子数量。这里row[i]-1的原因是因为要留下一杯的量。这样这层的第一个与最后一个就完成了赋值,假设现在是第2层也就是i=1,我们的一个杯子酒量就为2,最后一个杯子酒量也为2。这里调用max函数的目的是因为如果上层获得的量不足1,那么就没办法往下流,也就是说下层没办法获得酒。如果不加这个会获得一个负数。
for(int j=1;j<i;j++)
{
nextrow[j]=(Math.max(0,(row[j-1]-1))+Math.max(0,(row[j]-1)))/2;
//除了第一个和最后一个外,每个杯子获得的总量是上一层同位号杯子的一半,以及同为号前个杯子的一半
}
这部分代码是对除第一个与最后一个酒杯外的酒杯进行赋值,除去第一个和最后一个酒杯每个酒杯获得的酒量是 (上一层同位号获得的酒量-1)/2+(上一层同位号的前一个-1)/2;
调用max函数的目的与前面一样,如果小于1就不会有酒流入本层。
row=nextrow;
本次循环结束,让这层变为下层的上一层。
我们继徐往下走。
在第2层第一个杯子里有2份,第二个杯子3份。
然后到了第三层,经过赋值第一个杯子有0.5份,第三个杯子有0.5份,第二个杯子有1份。
到第四层第一个杯子得到0份,因为第三层第一个杯子里只获得了0.5份
Math.max(0,(row[0]-1))/2,无法向下流,所以第四层第一个只有0份。
同理最后一个也只有0份。
至于第二个与第三个
Math.max(0,(row[i-1]-1))/2
上层第2个获得的量为1,所以经过运算,流到下层的量也为0,整个第四层没有获得酒。
当然我们不需要推的这么彻底。
只是方便理解
要求我们求第query_row行你就将终止条件设置为query_row就行了。
最后一个返回值调用min的原因是为防止所求的酒杯获得的量是大于1的如果大于1,我们直接返回1就行了,如果不大于1我们就返回本身就行了
LeetCode日记(香槟塔)第三天相关推荐
- Leetcode 799. 香槟塔
我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任何溢出的香槟都 ...
- Java实现 LeetCode 799 香槟塔 (暴力模拟)
799. 香槟塔 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了 ...
- LeetCode 799. 香槟塔(DP动态规划)
文章目录 1. 题目 2. 解题 1. 题目 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾 ...
- 图解LeetCode——799. 香槟塔(难度:中等)
一.题目 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟, ...
- 力扣(LeetCode)799. 香槟塔(C++)
动态规划 设 iii 是行 , jjj 是列 , f[i][j]f[i][j]f[i][j] 表示经过杯子的酒量 ,初始 f[0][0]=pouredf[0][0]=pouredf[0][0]=pou ...
- LC-799.香槟塔
8月22号腾讯笔试题 "水站的水流量" 799. 香槟塔 难度中等 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每 ...
- 799. 香槟塔 : 简单线性 DP 运用题
题目描述 这是 LeetCode 上的 799. 香槟塔 ,难度为 中等. Tag : 「动态规划」.「线性 DP」 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个 ...
- leecode.799. 香槟塔
题目 香槟塔 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任 ...
- 二维香槟塔问题分析过程记录
二维香槟塔物理模型分析 在取消酒杯数量和行数的限制下,还原倒酒全过程,深度分析第[i,j]个酒杯注满需要多少杯酒 这篇笔记先单纯分析问题 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有 ...
- 【每日一题Day33】LC799香槟塔 | 动态规划
香槟塔[LC799] 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的第一个玻璃杯开始倾 ...
最新文章
- 修改Linux内核的printk缓冲区(log缓冲区)大小
- 读书笔记《React引领未来的用户界面开发框架》
- (30)保护模式阶段测试
- 神策 FM:做一名数据分析师是什么体验?
- 关于 redis.properties配置文件及rule
- Anaconda2安装时出现问题
- 个人理财有哪些基本原理和方法?
- 总结面试时没有回答上的内存对齐问题
- CentOS下Composer的安装和使用
- 折叠屏究竟是不是智能手机的未来?| 畅言
- html5在别的电脑上打不开,U盘在别台电脑上打不开的原因分析及解决
- linux命令学习_实验楼(一)
- 如何保存ISE综合后的RTL schematic为pdf
- protel常用元件封装大全
- 从拉新、促活/留存和营收说起,做运营到底是在做什么?
- Logistic映射在图像加密中的应用
- 一、Azure Kinect 传感器 SDK 下载——Azure Kinect DK入门
- Python数据导入
- Lambda表达式的一些相关知识理解
- TPM零知识学习九 —— tpm全安装流程复盘(上)