From db49a8c0cd62e04c39b25c60b528ef8ad9a98e8c Mon Sep 17 00:00:00 2001 From: fartem Date: Mon, 13 Jan 2025 11:21:42 +0300 Subject: [PATCH] 2025-01-13 v. 7.9.7: added "895. Maximum Frequency Stack" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- lib/hard/895_maximum_frequency_stack.rb | 37 +++++++++++++++++++ test/hard/test_895_maximum_frequency_stack.rb | 22 +++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 lib/hard/895_maximum_frequency_stack.rb create mode 100644 test/hard/test_895_maximum_frequency_stack.rb diff --git a/README.md b/README.md index dd8f58b8..7b2ff29e 100644 --- a/README.md +++ b/README.md @@ -666,3 +666,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 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) | | 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 24afc302..58543e7b 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 = '7.9.6' + s.version = '7.9.7' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/hard/895_maximum_frequency_stack.rb b/lib/hard/895_maximum_frequency_stack.rb new file mode 100644 index 00000000..641f5c57 --- /dev/null +++ b/lib/hard/895_maximum_frequency_stack.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/maximum-frequency-stack/ +class FreqStack + # Init + def initialize + @freq = {} + @group = {} + @max_freq = 0 + end + + # @param {Integer} val + # @return {Void} + def push(val) + f = @freq.fetch(val, 0) + 1 + @freq[val] = f + + @max_freq = f if f > @max_freq + + if @group.key?(f) + @group[f] << val + else + @group[f] = [val] + end + end + + # @return {Integer} + def pop + stack = @group[@max_freq] + x = stack.delete_at(stack.size - 1) + @freq[x] = @freq[x] - 1 + + @max_freq -= 1 if @group[@max_freq].size.zero? + + x + end +end diff --git a/test/hard/test_895_maximum_frequency_stack.rb b/test/hard/test_895_maximum_frequency_stack.rb new file mode 100644 index 00000000..d5f61d19 --- /dev/null +++ b/test/hard/test_895_maximum_frequency_stack.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/hard/895_maximum_frequency_stack' +require 'minitest/autorun' + +class MaximumFrequencyStackTest < ::Minitest::Test + def test_default_one + freq_stack = ::FreqStack.new + freq_stack.push(5) + freq_stack.push(7) + freq_stack.push(5) + freq_stack.push(7) + freq_stack.push(4) + freq_stack.push(5) + + assert_equal(5, freq_stack.pop) + assert_equal(7, freq_stack.pop) + assert_equal(5, freq_stack.pop) + assert_equal(4, freq_stack.pop) + end +end