From ab92bb332ab4dd1750e28e601813d38623c96bff Mon Sep 17 00:00:00 2001 From: fartem Date: Thu, 19 Dec 2024 10:01:45 +0300 Subject: [PATCH] 2024-12-19 v. 7.4.0: added "659. Split Array into Consecutive Subsequences" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- ...lit_array_into_consecutive_subsequences.rb | 52 +++++++++++++++++++ ...lit_array_into_consecutive_subsequences.rb | 13 +++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 lib/medium/659_split_array_into_consecutive_subsequences.rb create mode 100644 test/medium/test_659_split_array_into_consecutive_subsequences.rb diff --git a/README.md b/README.md index 4472b34f..970602b1 100644 --- a/README.md +++ b/README.md @@ -604,3 +604,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 648. Replace Words | [Link](https://leetcode.com/problems/replace-words/) | [Link](./lib/medium/648_replace_words.rb) | [Link](./test/medium/test_648_replace_words.rb) | | 652. Find Duplicate Subtrees | [Link](https://leetcode.com/problems/find-duplicate-subtrees/) | [Link](./lib/medium/652_find_duplicate_subtrees.rb) | [Link](./test/medium/test_652_find_duplicate_subtrees.rb) | | 654. Maximum Binary Tree | [Link](https://leetcode.com/problems/maximum-binary-tree/) | [Link](./lib/medium/654_maximum_binary_tree.rb) | [Link](./test/medium/test_654_maximum_binary_tree.rb) | +| 659. Split Array into Consecutive Subsequences | [Link](https://leetcode.com/problems/split-array-into-consecutive-subsequences/) | [Link](./lib/medium/659_split_array_into_consecutive_subsequences.rb) | [Link](./test/medium/test_659_split_array_into_consecutive_subsequences.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 3e840194..94c688e8 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.3.9.1' + s.version = '7.4.0' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/659_split_array_into_consecutive_subsequences.rb b/lib/medium/659_split_array_into_consecutive_subsequences.rb new file mode 100644 index 00000000..f3c22707 --- /dev/null +++ b/lib/medium/659_split_array_into_consecutive_subsequences.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/split-array-into-consecutive-subsequences/ +# @param {Integer[]} nums +# @return {Boolean} +def is_possible(nums) + count = ::Hash.new(0) + nums.each { |num| count[num] += 1 } + tail = ::Hash.new(0) + + nums.each do |num| + next if count[num].zero? + + count[num] -= 1 + + if tail[num - 1].positive? + tail[num] += 1 + tail[num - 1] -= 1 + elsif count[num + 1].positive? && count[num + 2].positive? + count[num + 1] -= 1 + count[num + 2] -= 1 + tail[num + 2] += 1 + else + return false + end + end + + true +end + +# count = Hash.new { 0 } +# nums.each { |num| count[num] += 1 } +# tail = Hash.new { 0 } + +# nums.each do |num| +# next if count[num] == 0 + +# count[num] -= 1 + +# if tail[num-1] > 0 +# tail[num] += 1 +# tail[num-1] -= 1 +# elsif count[num+1] > 0 && count[num+2] > 0 +# count[num+1] -= 1 +# count[num+2] -= 1 +# tail[num+2] += 1 +# else +# return false +# end +# end + +# true diff --git a/test/medium/test_659_split_array_into_consecutive_subsequences.rb b/test/medium/test_659_split_array_into_consecutive_subsequences.rb new file mode 100644 index 00000000..75ef9a10 --- /dev/null +++ b/test/medium/test_659_split_array_into_consecutive_subsequences.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/medium/659_split_array_into_consecutive_subsequences' +require 'minitest/autorun' + +class SplitArrayIntoConsecutiveSubsequencesTest < ::Minitest::Test + def test_default_one = assert(is_possible([1, 2, 3, 3, 4, 5])) + + def test_default_two = assert(is_possible([1, 2, 3, 3, 4, 4, 5, 5])) + + def test_default_three = assert(!is_possible([1, 2, 3, 4, 4, 5])) +end