|
| 1 | +// Runtime: 65 ms (Top 67.95%) | Memory: 48.40 MB (Top 39.74%) |
| 2 | + |
| 3 | +/** |
| 4 | + * @param {number} poured |
| 5 | + * @param {number} query_row |
| 6 | + * @param {number} query_glass |
| 7 | + * @return {number} |
| 8 | + */ |
1 | 9 | var champagneTower = function(poured, query_row, query_glass) {
|
2 |
| - |
3 |
| - let water = [poured]; |
4 |
| - let hasOverflow = true; |
5 |
| - let row = 0; |
| 10 | + let glassLevels = Array(100).fill(0.0); |
| 11 | + glassLevels[0] = poured; |
6 | 12 |
|
7 |
| - while(true){ |
8 |
| - |
9 |
| - if (! hasOverflow) return 0 // We haven't reached query_row yet, and water ran out |
10 |
| - hasOverflow = false; |
11 |
| - |
12 |
| - let rowGlass = Array(water.length).fill(0); // List of glasses at current row |
13 |
| - for (let i = 0; i < rowGlass.length; i++){ |
14 |
| - let input = water[i]; |
15 |
| - if (input <= 1){ |
16 |
| - rowGlass[i] = input; |
17 |
| - water[i] = 0 |
18 |
| - }else{ |
19 |
| - rowGlass[i] = 1; |
20 |
| - water[i]-- |
21 |
| - } |
22 |
| - if (row == query_row && i == query_glass){ // Return if we reach goal before water run out |
23 |
| - return rowGlass[i] |
24 |
| - } |
25 |
| - } |
26 |
| - // console.log('row,rowGlass',row,rowGlass); // to debug |
27 |
| - |
28 |
| - let nextWater = Array(water.length + 1).fill(0); // water poured towards next row, |
29 |
| - for (let i = 0; i < rowGlass.length; i++){ |
30 |
| - let overflow = water[i]; |
31 |
| - |
32 |
| - if (overflow > 0) hasOverflow = true; |
33 |
| - |
34 |
| - nextWater[i] += overflow / 2; |
35 |
| - nextWater[i+1] += overflow / 2; |
| 13 | + for (let curRow = 0; curRow < query_row; curRow++) { |
| 14 | + let nextLevels = Array(100).fill(0.0); |
| 15 | + |
| 16 | + for (let curGlass = 0; curGlass <= curRow; curGlass++) { |
| 17 | + let overflow = Math.max(0, (glassLevels[curGlass] - 1.0) / 2.0); |
| 18 | + nextLevels[curGlass] += overflow; |
| 19 | + nextLevels[curGlass + 1] += overflow; |
36 | 20 | }
|
37 |
| - water = nextWater; |
38 |
| - row ++; |
| 21 | + |
| 22 | + glassLevels = nextLevels; |
39 | 23 | }
|
| 24 | + |
| 25 | + return Math.min(1.0, glassLevels[query_glass]); |
40 | 26 | };
|
0 commit comments