diff --git a/README.md b/README.md index 381609d0..d41ecea1 100644 --- a/README.md +++ b/README.md @@ -621,3 +621,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 739. Daily Temperatures | [Link](https://leetcode.com/problems/daily-temperatures/) | [Link](./lib/medium/739_daily_temperatures.rb) | [Link](./test/medium/test_739_daily_temperatures.rb) | | 763. Partition Labels | [Link](https://leetcode.com/problems/partition-labels/) | [Link](./lib/medium/763_partition_labels.rb) | [Link](./test/medium/test_763_partition_labels.rb) | | 784. Letter Case Permutation | [Link](https://leetcode.com/problems/letter-case-permutation/) | [Link](./lib/medium/784_letter_case_permutation.rb) | [Link](./test/medium/test_784_letter_case_permutation.rb) | +| 797. All Paths From Source to Target | [Link](https://leetcode.com/problems/all-paths-from-source-to-target/) | [Link](./lib/medium/797_all_paths_from_source_to_target.rb) | [Link](./test/medium/test_797_all_paths_from_source_to_target.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index 34e949c3..4135acb1 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.5.6' + s.version = '7.5.7' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/797_all_paths_from_source_to_target.rb b/lib/medium/797_all_paths_from_source_to_target.rb new file mode 100644 index 00000000..3215e1a5 --- /dev/null +++ b/lib/medium/797_all_paths_from_source_to_target.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/all-paths-from-source-to-target/ +# @param {Integer[][]} graph +# @return {Integer[][]} +def all_paths_source_target(graph) + result = [] + fill_paths_for_all_paths_source_target(result, [0], graph, 0) + + result +end + +private + +# @param {Integer[][]} result +# @param {Integer[]} list +# @param {Integer[][]} graph +# @param {Integer} start +# @return {Void} +def fill_paths_for_all_paths_source_target(result, list, graph, start) + if start == graph.size - 1 + result << list.clone + else + (0...graph[start].size).each do |i| + curr = graph[start][i] + list << curr + fill_paths_for_all_paths_source_target(result, list, graph, curr) + list.delete_at(list.size - 1) + end + end +end diff --git a/test/medium/test_797_all_paths_from_source_to_target.rb b/test/medium/test_797_all_paths_from_source_to_target.rb new file mode 100644 index 00000000..9daf3785 --- /dev/null +++ b/test/medium/test_797_all_paths_from_source_to_target.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/medium/797_all_paths_from_source_to_target' +require 'minitest/autorun' + +class AllPathsFromSourceToTargetTest < ::Minitest::Test + def test_default_one + assert_equal( + [ + [0, 1, 3], + [0, 2, 3] + ], + all_paths_source_target( + [ + [1, 2], + [3], + [3], + [] + ] + ) + ) + end + + def test_default_two + assert_equal( + [ + [0, 4], + [0, 3, 4], + [0, 1, 3, 4], + [0, 1, 2, 3, 4], + [0, 1, 4] + ], + all_paths_source_target( + [ + [4, 3, 1], + [3, 2, 4], + [3], + [4], + [] + ] + ) + ) + end +end