diff --git a/README.md b/README.md index e1d3a7fe..86ac4246 100644 --- a/README.md +++ b/README.md @@ -559,3 +559,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 371. Sum of Two Integers | [Link](https://leetcode.com/problems/sum-of-two-integers/) | [Link](./lib/medium/371_sum_of_two_integers.rb) | [Link](./test/medium/test_371_sum_of_two_integers.rb) | | 377. Combination Sum IV | [Link](https://leetcode.com/problems/combination-sum-iv/) | [Link](./lib/medium/377_combination_sum_iv.rb) | [Link](./test/medium/test_377_combination_sum_iv.rb) | | 378. Kth Smallest Element in a Sorted Matrix | [Link](https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/) | [Link](./lib/medium/378_kth_smallest_element_in_a_sorted_matrix.rb) | [Link](./test/medium/test_378_kth_smallest_element_in_a_sorted_matrix.rb) | +| 380. Insert Delete GetRandom O(1) | [Link](https://leetcode.com/problems/insert-delete-getrandom-o1/) | [Link](./lib/medium/380_insert_delete_getrandom_o1.rb) | [Link](./test/medium/test_380_insert_delete_getrandom_o1.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index d6eb05ea..bf51dc15 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 = '6.9.3' + s.version = '6.9.4' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/380_insert_delete_getrandom_o1.rb b/lib/medium/380_insert_delete_getrandom_o1.rb new file mode 100644 index 00000000..4b5adb55 --- /dev/null +++ b/lib/medium/380_insert_delete_getrandom_o1.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/insert-delete-getrandom-o1/ +class RandomizedSet + # Init + def initialize + @table = {} + @values = [] + end + + # @param {Integer} val + # @return {Boolean} + def insert(val) + return false if @table[val] + + @table[val] = @values.size + @values << val + + true + end + + # @param {Integer} val + # @return {Boolean} + def remove(val) + return false unless @table[val] + + last_val = @values.pop + unless val == last_val + @table[last_val] = @table[val] + @values[@table[val]] = last_val + end + + @table.delete(val) + + true + end + + # @rerturn {Integer} + def get_random = @values[rand(@values.size)] +end diff --git a/test/medium/test_380_insert_delete_getrandom_o1.rb b/test/medium/test_380_insert_delete_getrandom_o1.rb new file mode 100644 index 00000000..b646e7a7 --- /dev/null +++ b/test/medium/test_380_insert_delete_getrandom_o1.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/medium/380_insert_delete_getrandom_o1' +require 'minitest/autorun' + +class InsertDeleteGetRandomO1Test < ::Minitest::Test + def test_default_one + randomized_set = ::RandomizedSet.new + assert(randomized_set.insert(1)) + assert(!randomized_set.remove(2)) + assert(randomized_set.insert(2)) + assert(randomized_set.get_random == 1 || randomized_set.get_random == 2) + assert(randomized_set.remove(1)) + assert(!randomized_set.insert(2)) + assert_equal(2, randomized_set.get_random) + end +end