From 167e98291d589e4b30ba4d591dce985932f599aa Mon Sep 17 00:00:00 2001 From: fartem Date: Sun, 19 Jan 2025 03:20:42 +0300 Subject: [PATCH] 2025-01-19 v. 8.1.7: added "407. Trapping Rain Water II" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- lib/hard/407_trapping_rain_water_ii.rb | 57 ++++++++++++++++++++ test/hard/test_407_trapping_rain_water_ii.rb | 49 +++++++++++++++++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 lib/hard/407_trapping_rain_water_ii.rb create mode 100644 test/hard/test_407_trapping_rain_water_ii.rb diff --git a/README.md b/README.md index 25d230a5..afb3302e 100644 --- a/README.md +++ b/README.md @@ -676,6 +676,7 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 297. Serialize and Deserialize Binary Tree | [Link](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/) | [Link](./lib/hard/297_serialize_and_deserialize_binary_tree.rb) | [Link](./test/hard/test_297_serialize_and_deserialize_binary_tree.rb) | | 336. Palindrome Pairs | [Link](https://leetcode.com/problems/palindrome-pairs/) | [Link](./lib/hard/336_palindrome_pairs.rb) | [Link](./test/hard/test_336_palindrome_pairs.rb) | | 363. Max Sum of Rectangle No Larger Than K | [Link](https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/) | [Link](./lib/hard/363_max_sum_of_rectangle_no_larger_than_k.rb) | [Link](./test/hard/test_363_max_sum_of_rectangle_no_larger_than_k.rb) | +| 407. Trapping Rain Water II | [Link](https://leetcode.com/problems/trapping-rain-water-ii/) | [Link](./lib/hard/407_trapping_rain_water_ii.rb) | [Link](./test/hard/test_407_trapping_rain_water_ii.rb) | | 458. Poor Pigs | [Link](https://leetcode.com/problems/poor-pigs/) | [Link](./lib/hard/458_poor_pigs.rb) | [Link](./test/hard/test_458_poor_pigs.rb) | | 871. Minimum Number of Refueling Stops | [Link](https://leetcode.com/problems/minimum-number-of-refueling-stops/) | [Link](./lib/hard/871_minimum_number_of_refueling_stops.rb) | [Link](./test/hard/test_871_minimum_number_of_refueling_stops.rb) | | 895. Maximum Frequency Stack | [Link](https://leetcode.com/problems/maximum-frequency-stack/) | [Link](./lib/hard/895_maximum_frequency_stack.rb) | [Link](./test/hard/test_895_maximum_frequency_stack.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index dc21a137..a507e12e 100644 --- a/leetcode-ruby.gemspec +++ b/leetcode-ruby.gemspec @@ -5,7 +5,7 @@ require 'English' ::Gem::Specification.new do |s| s.required_ruby_version = '>= 3.0' s.name = 'leetcode-ruby' - s.version = '8.1.6' + s.version = '8.1.7' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/hard/407_trapping_rain_water_ii.rb b/lib/hard/407_trapping_rain_water_ii.rb new file mode 100644 index 00000000..3f0f76b6 --- /dev/null +++ b/lib/hard/407_trapping_rain_water_ii.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/trapping-rain-water-ii/ +# @param {Integer[][]} height_map +# @return {Integer} +def trap_rain_water(height_map) + trapped_water = 0 + water_level_map = ::Array.new(height_map.size) { ::Array.new(height_map[0].size, 20_000) } + + (1...height_map.size - 1).each do |i| + water_level_map[i][0] = height_map[i][0] + + (1...height_map[i].size - 1).each { |j| water_level_map[i][j] = 20_000 } + + water_level_map[i][height_map[i].size - 1] = height_map[i][height_map[i].size - 1] + end + + (0...height_map[0].size).each do |i| + water_level_map[0][i] = height_map[0][i] + water_level_map[height_map.size - 1][i] = height_map[height_map.size - 1][i] + end + + drain = true + while drain + drain = false + (1...height_map[0].size - 1).each do |i| + (1...height_map.size - 1).each do |j| + next unless water_level_map[j][i] > height_map[j][i] + + water_level_map[j][i] = [water_level_map[j][i - 1], height_map[j][i]].max if water_level_map[j][i] > water_level_map[j][i - 1] + water_level_map[j][i] = [water_level_map[j - 1][i], height_map[j][i]].max if water_level_map[j][i] > water_level_map[j - 1][i] + end + end + + (height_map[0].size - 2).downto(1) do |i| + (height_map.size - 2).downto(1) do |j| + next unless water_level_map[j][i] > height_map[j][i] + + water_level_map[j][i] = [water_level_map[j][i + 1], height_map[j][i]].max if water_level_map[j][i] > water_level_map[j][i + 1] + water_level_map[j][i] = [water_level_map[j + 1][i], height_map[j][i]].max if water_level_map[j][i] > water_level_map[j + 1][i] + + next unless water_level_map[j][i] < water_level_map[j][i + 1] && water_level_map[j][i + 1] > height_map[j][i + 1] || + water_level_map[j][i] < water_level_map[j + 1][i] && water_level_map[j + 1][i] > height_map[j + 1][i] + + drain = true + end + end + end + + (1...water_level_map.size - 1).each do |i| + (1...water_level_map[i].size - 1).each do |j| + trapped_water += water_level_map[i][j] - height_map[i][j] + end + end + + trapped_water +end diff --git a/test/hard/test_407_trapping_rain_water_ii.rb b/test/hard/test_407_trapping_rain_water_ii.rb new file mode 100644 index 00000000..baf7fbc0 --- /dev/null +++ b/test/hard/test_407_trapping_rain_water_ii.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/hard/407_trapping_rain_water_ii' +require 'minitest/autorun' + +class TrappingRainWaterIITest < ::Minitest::Test + def test_default_one + assert_equal( + 4, + trap_rain_water( + [ + [1, 4, 3, 1, 3, 2], + [3, 2, 1, 3, 2, 4], + [2, 3, 3, 2, 3, 1] + ] + ) + ) + end + + def test_default_two + assert_equal( + 10, + trap_rain_water( + [ + [3, 3, 3, 3, 3], + [3, 2, 2, 2, 3], + [3, 2, 1, 2, 3], + [3, 2, 2, 2, 3], + [3, 3, 3, 3, 3] + ] + ) + ) + end + + def test_additional_one + assert_equal( + 3, + trap_rain_water( + [ + [5, 5, 5, 1], + [5, 1, 1, 5], + [5, 1, 5, 5], + [5, 2, 5, 8] + ] + ) + ) + end +end