From f73e429f524b372ef3071eab3f540e2eb8d18b81 Mon Sep 17 00:00:00 2001 From: fartem Date: Wed, 18 Dec 2024 09:14:06 +0300 Subject: [PATCH] 2024-12-18 v. 7.3.9: added "654. Maximum Binary Tree" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- lib/common/binary_tree.rb | 2 + lib/medium/654_maximum_binary_tree.rb | 36 ++++++++++++++ test/medium/test_654_maximum_binary_tree.rb | 54 +++++++++++++++++++++ 5 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 lib/medium/654_maximum_binary_tree.rb create mode 100644 test/medium/test_654_maximum_binary_tree.rb diff --git a/README.md b/README.md index 9228ed54..4472b34f 100644 --- a/README.md +++ b/README.md @@ -603,3 +603,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 647. Palindromic Substrings | [Link](https://leetcode.com/problems/palindromic-substrings/) | [Link](./lib/medium/647_palindromic_substrings.rb) | [Link](./test/medium/test_647_palindromic_substrings.rb) | | 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) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index dd1047d6..30a001f9 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.8' + s.version = '7.3.9' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/common/binary_tree.rb b/lib/common/binary_tree.rb index 9e627bf2..8ed1d90d 100644 --- a/lib/common/binary_tree.rb +++ b/lib/common/binary_tree.rb @@ -18,11 +18,13 @@ def initialize(val = 0, left = nil, right = nil) # @return {Boolean} def self.are_equals(curr, other) return true if !curr && !other + return false if !curr || !other curr_eq = curr.val == other.val left_eq = are_equals(curr.left, other.left) right_eq = are_equals(curr.right, other.right) + curr_eq && left_eq && right_eq end diff --git a/lib/medium/654_maximum_binary_tree.rb b/lib/medium/654_maximum_binary_tree.rb new file mode 100644 index 00000000..38af76cf --- /dev/null +++ b/lib/medium/654_maximum_binary_tree.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/maximum-binary-tree/ +# @param {Integer[]} nums +# @return {TreeNode} +def construct_maximum_binary_tree(nums) + expand_construct_maximum_binary_tree(nums, 0, nums.size) +end + +private + +# @param {Integer[]} nums +# @param {Integer} left +# @param {Integer} right +# @return {Boolean} +def expand_construct_maximum_binary_tree(nums, left, right) + return if left == right + + max = max_for_maximum_binary_tree(nums, left, right) + root = ::TreeNode.new(nums[max]) + root.left = expand_construct_maximum_binary_tree(nums, left, max) + root.right = expand_construct_maximum_binary_tree(nums, max + 1, right) + + root +end + +# @param {Integer[]} nums +# @param {Integer} left +# @param {Integer} right +# @return {Integer} +def max_for_maximum_binary_tree(nums, left, right) + max = left + (left...right).each { |i| max = i if nums[max] < nums[i] } + + max +end diff --git a/test/medium/test_654_maximum_binary_tree.rb b/test/medium/test_654_maximum_binary_tree.rb new file mode 100644 index 00000000..42decb8b --- /dev/null +++ b/test/medium/test_654_maximum_binary_tree.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/common/binary_tree' +require_relative '../../lib/medium/654_maximum_binary_tree' +require 'minitest/autorun' + +class MaximumBinaryTreeTest < ::Minitest::Test + def test_default_one + assert( + ::TreeNode.are_equals( + ::TreeNode.new( + 6, + ::TreeNode.new( + 3, + nil, + ::TreeNode.new( + 2, + nil, + ::TreeNode.new(1) + ) + ), + ::TreeNode.new( + 5, + ::TreeNode.new(0), + nil + ) + ), + construct_maximum_binary_tree( + [3, 2, 1, 6, 0, 5] + ) + ) + ) + end + + def test_default_two + assert( + ::TreeNode.are_equals( + ::TreeNode.new( + 3, + nil, + ::TreeNode.new( + 2, + nil, + ::TreeNode.new(1) + ) + ), + construct_maximum_binary_tree( + [3, 2, 1] + ) + ) + ) + end +end