Files
rose-ash/lib/ocaml/baseline/trapping_rain.ml
giles 0231bb46a6
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 28s
ocaml: phase 5.1 trapping_rain.ml baseline (LeetCode trapped water = 6)
Classic trapped-rain-water two-pass DP:

  left_max[i]  = max(heights[0..i])    (forward sweep)
  right_max[i] = max(heights[i..n-1])  (downto sweep)
  water        = sum over i of (min(left_max[i], right_max[i])
                                  - heights[i])

For [0; 1; 0; 2; 1; 0; 1; 3; 2; 1; 2; 1]: water = 6.

Tests dual sweep (forward + downto), array of running maxes,
inline-if rhs of <- for running-max update (uses iter-236 fix
for <- accepting if/match RHS).

203 baseline programs total.
2026-05-11 05:54:39 +00:00

26 lines
768 B
OCaml

let trap heights =
let n = Array.length heights in
if n < 3 then 0
else begin
let left_max = Array.make n 0 in
let right_max = Array.make n 0 in
left_max.(0) <- heights.(0);
for i = 1 to n - 1 do
left_max.(i) <- if heights.(i) > left_max.(i - 1) then heights.(i) else left_max.(i - 1)
done;
right_max.(n - 1) <- heights.(n - 1);
for i = n - 2 downto 0 do
right_max.(i) <- if heights.(i) > right_max.(i + 1) then heights.(i) else right_max.(i + 1)
done;
let water = ref 0 in
for i = 0 to n - 1 do
let min_lr = if left_max.(i) < right_max.(i) then left_max.(i) else right_max.(i) in
water := !water + min_lr - heights.(i)
done;
!water
end
;;
trap [| 0; 1; 0; 2; 1; 0; 1; 3; 2; 1; 2; 1 |]