|
2 | 2 | * @param{number[]} terraces |
3 | 3 | * @return{number} |
4 | 4 | */ |
5 | | - |
6 | | -/* |
7 | | - * STEPS |
8 | | - * 1. Find the highest terraces on the left and right side of the elevation map: |
9 | | - * e.g. [0, 2, 4, 3, 1, 2, 4, 0, 8, 7, 0] => (leftMax = 4, rightMax = 8) |
10 | | - * This is because water will "trail off" the sides of the terraces. |
11 | | - * |
12 | | - * 2. At this point, we are essentially dealing with a new map: [4, 3, 4, 2, 4, 0, 8]. |
13 | | - * From here, we loop through the map from the left to the right (if leftMax > rightMax, |
14 | | - * otherwise we move from right to left), adding water as we go unless we reach a value |
15 | | - * that is greater than or equal to leftMax || rightMax. |
16 | | - * e.g. [4, 3, 4, 2, 4, 0, 8] |
17 | | - * ^ |
18 | | - * water += leftMax - 3 => water = 1 |
19 | | - * or if the terrace array was reversed: |
20 | | - * e.g. [8, 0, 4, 2, 4, 3, 4] |
21 | | - * ^ |
22 | | - * water += rightMax - 3 => water = 1 |
23 | | - * |
24 | | - * 3. Again, we've essentially shortened the map: [4, 2, 4, 0, 8]. |
25 | | - * Now we repeat the above steps on the new array. |
26 | | - * e.g. |
27 | | - * Next Iteration: |
28 | | - * [4, 2, 4, 0, 8] |
29 | | - * ^ |
30 | | - * water += leftMax - 2 => water = 3 |
31 | | - * |
32 | | - * Next Iteration: |
33 | | - * [4, 0, 8] |
34 | | - * ^ |
35 | | - * water += leftMax - 0 => water = 7 |
36 | | - * |
37 | | - * return water(7) |
38 | | - */ |
39 | 5 | exportdefaultfunctionrainTerraces(terraces){ |
40 | | -letstart=0; |
41 | | -letend=terraces.length-1; |
42 | | -letwater=0; |
43 | | -letleftMax=0; |
44 | | -letrightMax=0; |
| 6 | +/* |
| 7 | + * STEPS |
| 8 | + * |
| 9 | + * 1. Find the highest terraces on the left and right side of the elevation map: |
| 10 | + * e.g. for [0, 2, 4, 3, 4, 2, 4, 0, 8, 7, 0] we would have leftMax = 4 and rightMax = 8. |
| 11 | + * This is because water will "trail off" the sides of the terraces. |
| 12 | + * |
| 13 | + * 2. At this point, we are essentially dealing with a new map: [4, 3, 4, 2, 4, 0, 8]. |
| 14 | + * From here, we loop through the map from the left to the right if leftMax < rightMax |
| 15 | + * (otherwise we move from right to left), adding water as we go unless we reach a value |
| 16 | + * that is greater than or equal to leftMax or rightMax. |
| 17 | + * e.g. [4, 3, 4, 2, 4, 0, 8] |
| 18 | + * ^ |
| 19 | + * water = water + (leftMax - 3) = 1 |
| 20 | + * |
| 21 | + * or if the terrace array was reversed: |
| 22 | + * e.g. [8, 0, 4, 2, 4, 3, 4] |
| 23 | + * ^ |
| 24 | + * water = water + (rightMax - 3) = 1 |
| 25 | + * |
| 26 | + * 3. Again, we've essentially shortened the map: [4, 2, 4, 0, 8]. |
| 27 | + * Now we repeat the above steps on the new array. |
| 28 | + * |
| 29 | + * Next Iteration: |
| 30 | + * [4, 2, 4, 0, 8] |
| 31 | + * ^ |
| 32 | + * water = water + (leftMax - 2) = 3 |
| 33 | + * |
| 34 | + * Next Iteration: |
| 35 | + * [4, 0, 8] |
| 36 | + * ^ |
| 37 | + * water = water + (leftMax - 0) = 7 |
| 38 | + * |
| 39 | + * 4. Return result: 7 |
| 40 | + */ |
| 41 | +letleftIndex=0; |
| 42 | +letrightIndex=terraces.length-1; |
| 43 | + |
| 44 | +letleftMaxLevel=0; |
| 45 | +letrightMaxLevel=0; |
45 | 46 |
|
46 | | -while(start<end){ |
47 | | -// Loop to find left max |
48 | | -while(start<end&&terraces[start]<=terraces[start+1]){ |
49 | | -start+=1; |
| 47 | +letwaterAmount=0; |
| 48 | + |
| 49 | +while(leftIndex<rightIndex){ |
| 50 | +// Loop to find the highest terrace from the left side. |
| 51 | +while(leftIndex<rightIndex&&terraces[leftIndex]<=terraces[leftIndex+1]){ |
| 52 | +leftIndex+=1; |
50 | 53 | } |
51 | | -leftMax=terraces[start]; |
52 | 54 |
|
53 | | -// Loop to find right max |
54 | | -while(end>start&&terraces[end]<=terraces[end-1]){ |
55 | | -end-=1; |
| 55 | +leftMaxLevel=terraces[leftIndex]; |
| 56 | + |
| 57 | +// Loop to find the highest terrace from the right side. |
| 58 | +while(rightIndex>leftIndex&&terraces[rightIndex]<=terraces[rightIndex-1]){ |
| 59 | +rightIndex-=1; |
56 | 60 | } |
57 | | -rightMax=terraces[end]; |
58 | 61 |
|
59 | | -// Determine which direction we need to move in |
60 | | -if(leftMax<rightMax){ |
61 | | -// Move from left to right and collect water |
62 | | -start+=1; |
63 | | -while(start<end&&terraces[start]<=leftMax){ |
64 | | -water+=leftMax-terraces[start]; |
65 | | -start+=1; |
| 62 | +rightMaxLevel=terraces[rightIndex]; |
| 63 | + |
| 64 | +// Determine which direction we need to go. |
| 65 | +if(leftMaxLevel<rightMaxLevel){ |
| 66 | +// Move from left to right and collect water. |
| 67 | +leftIndex+=1; |
| 68 | + |
| 69 | +while(leftIndex<rightIndex&&terraces[leftIndex]<=leftMaxLevel){ |
| 70 | +waterAmount+=leftMaxLevel-terraces[leftIndex]; |
| 71 | +leftIndex+=1; |
66 | 72 | } |
67 | 73 | }else{ |
68 | | -// Move from left to right and collect water |
69 | | -end-=1; |
70 | | -while(end>start&&terraces[end]<=rightMax){ |
71 | | -water+=rightMax-terraces[end]; |
72 | | -end-=1; |
| 74 | +// Move from right to left and collect water. |
| 75 | +rightIndex-=1; |
| 76 | + |
| 77 | +while(leftIndex<rightIndex&&terraces[rightIndex]<=rightMaxLevel){ |
| 78 | +waterAmount+=rightMaxLevel-terraces[rightIndex]; |
| 79 | +rightIndex-=1; |
73 | 80 | } |
74 | 81 | } |
75 | 82 | } |
76 | | -returnwater; |
| 83 | + |
| 84 | +returnwaterAmount; |
77 | 85 | } |
0 commit comments