mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-07 11:36:46 +08:00
build
This commit is contained in:
@@ -220,16 +220,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="preorder_traversal_i_compact.rb"
|
||||
=begin
|
||||
File: preorder_traversal_i_compact.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/tree_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Предварительный обход: пример 1 ###
|
||||
### Предварительный обход: пример 1 ###
|
||||
def pre_order(root)
|
||||
return unless root
|
||||
|
||||
@@ -534,16 +525,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="preorder_traversal_ii_compact.rb"
|
||||
=begin
|
||||
File: preorder_traversal_ii_compact.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/tree_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Предварительный обход: пример 2 ###
|
||||
### Предварительный обход: пример 2 ###
|
||||
def pre_order(root)
|
||||
return unless root
|
||||
|
||||
@@ -896,16 +878,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="preorder_traversal_iii_compact.rb"
|
||||
=begin
|
||||
File: preorder_traversal_iii_compact.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/tree_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Предварительный обход: пример 3 ###
|
||||
### Предварительный обход: пример 3 ###
|
||||
def pre_order(root)
|
||||
# Отсечение
|
||||
return if !root || root.val == 3
|
||||
@@ -1906,161 +1879,32 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="preorder_traversal_iii_template.rb"
|
||||
=begin
|
||||
File: preorder_traversal_iii_template.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/tree_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Проверка, является ли текущее состояние решением ###
|
||||
### Проверка, является ли текущее состояние решением ###
|
||||
def is_solution?(state)
|
||||
!state.empty? && state.last.val == 7
|
||||
end
|
||||
|
||||
=begin
|
||||
File: preorder_traversal_iii_template.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/tree_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Проверка, является ли текущее состояние решением ###
|
||||
def is_solution?(state)
|
||||
!state.empty? && state.last.val == 7
|
||||
end
|
||||
|
||||
# ## Записать решение ###
|
||||
### Записать решение ###
|
||||
def record_solution(state, res)
|
||||
res << state.dup
|
||||
end
|
||||
|
||||
=begin
|
||||
File: preorder_traversal_iii_template.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/tree_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Проверка, является ли текущее состояние решением ###
|
||||
def is_solution?(state)
|
||||
!state.empty? && state.last.val == 7
|
||||
end
|
||||
|
||||
# ## Записать решение ###
|
||||
def record_solution(state, res)
|
||||
res << state.dup
|
||||
end
|
||||
|
||||
# ## Проверка допустимости этого выбора в текущем состоянии ###
|
||||
### Проверка допустимости этого выбора в текущем состоянии ###
|
||||
def is_valid?(state, choice)
|
||||
choice && choice.val != 3
|
||||
end
|
||||
|
||||
=begin
|
||||
File: preorder_traversal_iii_template.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/tree_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Проверка, является ли текущее состояние решением ###
|
||||
def is_solution?(state)
|
||||
!state.empty? && state.last.val == 7
|
||||
end
|
||||
|
||||
# ## Записать решение ###
|
||||
def record_solution(state, res)
|
||||
res << state.dup
|
||||
end
|
||||
|
||||
# ## Проверка допустимости этого выбора в текущем состоянии ###
|
||||
def is_valid?(state, choice)
|
||||
choice && choice.val != 3
|
||||
end
|
||||
|
||||
# ## Обновить состояние ###
|
||||
### Обновить состояние ###
|
||||
def make_choice(state, choice)
|
||||
state << choice
|
||||
end
|
||||
|
||||
=begin
|
||||
File: preorder_traversal_iii_template.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/tree_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Проверка, является ли текущее состояние решением ###
|
||||
def is_solution?(state)
|
||||
!state.empty? && state.last.val == 7
|
||||
end
|
||||
|
||||
# ## Записать решение ###
|
||||
def record_solution(state, res)
|
||||
res << state.dup
|
||||
end
|
||||
|
||||
# ## Проверка допустимости этого выбора в текущем состоянии ###
|
||||
def is_valid?(state, choice)
|
||||
choice && choice.val != 3
|
||||
end
|
||||
|
||||
# ## Обновить состояние ###
|
||||
def make_choice(state, choice)
|
||||
state << choice
|
||||
end
|
||||
|
||||
# ## Восстановить состояние ###
|
||||
### Восстановить состояние ###
|
||||
def undo_choice(state, choice)
|
||||
state.pop
|
||||
end
|
||||
|
||||
=begin
|
||||
File: preorder_traversal_iii_template.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative '../utils/tree_node'
|
||||
require_relative '../utils/print_util'
|
||||
|
||||
# ## Проверка, является ли текущее состояние решением ###
|
||||
def is_solution?(state)
|
||||
!state.empty? && state.last.val == 7
|
||||
end
|
||||
|
||||
# ## Записать решение ###
|
||||
def record_solution(state, res)
|
||||
res << state.dup
|
||||
end
|
||||
|
||||
# ## Проверка допустимости этого выбора в текущем состоянии ###
|
||||
def is_valid?(state, choice)
|
||||
choice && choice.val != 3
|
||||
end
|
||||
|
||||
# ## Обновить состояние ###
|
||||
def make_choice(state, choice)
|
||||
state << choice
|
||||
end
|
||||
|
||||
# ## Восстановить состояние ###
|
||||
def undo_choice(state, choice)
|
||||
state.pop
|
||||
end
|
||||
|
||||
# ## Алгоритм бэктрекинга: пример 3 ###
|
||||
### Алгоритм бэктрекинга: пример 3 ###
|
||||
def backtrack(state, choices, res)
|
||||
# Проверить, является ли текущее состояние решением
|
||||
record_solution(state, res) if is_solution?(state)
|
||||
|
||||
@@ -703,13 +703,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="n_queens.rb"
|
||||
=begin
|
||||
File: n_queens.rb
|
||||
Created Time: 2024-05-21
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: n ферзей ###
|
||||
### Алгоритм бэктрекинга: n ферзей ###
|
||||
def backtrack(row, n, state, res, cols, diags1, diags2)
|
||||
# Когда все строки уже обработаны, записать решение
|
||||
if row == n
|
||||
@@ -736,40 +730,7 @@ comments: true
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
File: n_queens.rb
|
||||
Created Time: 2024-05-21
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: n ферзей ###
|
||||
def backtrack(row, n, state, res, cols, diags1, diags2)
|
||||
# Когда все строки уже обработаны, записать решение
|
||||
if row == n
|
||||
res << state.map { |row| row.dup }
|
||||
return
|
||||
end
|
||||
|
||||
# Обойти все столбцы
|
||||
for col in 0...n
|
||||
# Вычислить главную и побочную диагонали, соответствующие этой клетке
|
||||
diag1 = row - col + n - 1
|
||||
diag2 = row + col
|
||||
# Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
|
||||
if !cols[col] && !diags1[diag1] && !diags2[diag2]
|
||||
# Попытка: поставить ферзя в эту клетку
|
||||
state[row][col] = "Q"
|
||||
cols[col] = diags1[diag1] = diags2[diag2] = true
|
||||
# Перейти к размещению следующей строки
|
||||
backtrack(row + 1, n, state, res, cols, diags1, diags2)
|
||||
# Откат: восстановить эту клетку как пустую
|
||||
state[row][col] = "#"
|
||||
cols[col] = diags1[diag1] = diags2[diag2] = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# ## Решить задачу о n ферзях ###
|
||||
### Решить задачу о n ферзях ###
|
||||
def n_queens(n)
|
||||
# Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
|
||||
state = Array.new(n) { Array.new(n, "#") }
|
||||
|
||||
@@ -506,13 +506,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="permutations_i.rb"
|
||||
=begin
|
||||
File: permutations_i.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: все перестановки I ###
|
||||
### Алгоритм бэктрекинга: все перестановки I ###
|
||||
def backtrack(state, choices, selected, res)
|
||||
# Когда длина состояния равна числу элементов, записать решение
|
||||
if state.length == choices.length
|
||||
@@ -536,37 +530,7 @@ comments: true
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
File: permutations_i.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: все перестановки I ###
|
||||
def backtrack(state, choices, selected, res)
|
||||
# Когда длина состояния равна числу элементов, записать решение
|
||||
if state.length == choices.length
|
||||
res << state.dup
|
||||
return
|
||||
end
|
||||
|
||||
# Перебор всех вариантов выбора
|
||||
choices.each_with_index do |choice, i|
|
||||
# Отсечение: нельзя выбирать один и тот же элемент повторно
|
||||
unless selected[i]
|
||||
# Попытка: сделать выбор и обновить состояние
|
||||
selected[i] = true
|
||||
state << choice
|
||||
# Перейти к следующему выбору
|
||||
backtrack(state, choices, selected, res)
|
||||
# Откат: отменить выбор и восстановить предыдущее состояние
|
||||
selected[i] = false
|
||||
state.pop
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# ## Все перестановки I ###
|
||||
### Все перестановки I ###
|
||||
def permutations_i(nums)
|
||||
res = []
|
||||
backtrack([], nums, Array.new(nums.length, false), res)
|
||||
@@ -1087,13 +1051,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="permutations_ii.rb"
|
||||
=begin
|
||||
File: permutations_ii.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: все перестановки II ###
|
||||
### Алгоритм бэктрекинга: все перестановки II ###
|
||||
def backtrack(state, choices, selected, res)
|
||||
# Когда длина состояния равна числу элементов, записать решение
|
||||
if state.length == choices.length
|
||||
@@ -1119,39 +1077,7 @@ comments: true
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
File: permutations_ii.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: все перестановки II ###
|
||||
def backtrack(state, choices, selected, res)
|
||||
# Когда длина состояния равна числу элементов, записать решение
|
||||
if state.length == choices.length
|
||||
res << state.dup
|
||||
return
|
||||
end
|
||||
|
||||
# Перебор всех вариантов выбора
|
||||
duplicated = Set.new
|
||||
choices.each_with_index do |choice, i|
|
||||
# Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
|
||||
if !selected[i] && !duplicated.include?(choice)
|
||||
# Попытка: сделать выбор и обновить состояние
|
||||
duplicated.add(choice)
|
||||
selected[i] = true
|
||||
state << choice
|
||||
# Перейти к следующему выбору
|
||||
backtrack(state, choices, selected, res)
|
||||
# Откат: отменить выбор и восстановить предыдущее состояние
|
||||
selected[i] = false
|
||||
state.pop
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# ## Все перестановки II ###
|
||||
### Все перестановки II ###
|
||||
def permutations_ii(nums)
|
||||
res = []
|
||||
backtrack([], nums, Array.new(nums.length, false), res)
|
||||
|
||||
@@ -470,13 +470,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="subset_sum_i_naive.rb"
|
||||
=begin
|
||||
File: subset_sum_i_naive.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: сумма подмножеств I ###
|
||||
### Алгоритм бэктрекинга: сумма подмножеств I ###
|
||||
def backtrack(state, target, total, choices, res)
|
||||
# Если сумма подмножества равна target, записать решение
|
||||
if total == target
|
||||
@@ -497,34 +491,7 @@ comments: true
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
File: subset_sum_i_naive.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: сумма подмножеств I ###
|
||||
def backtrack(state, target, total, choices, res)
|
||||
# Если сумма подмножества равна target, записать решение
|
||||
if total == target
|
||||
res << state.dup
|
||||
return
|
||||
end
|
||||
|
||||
# Перебор всех вариантов выбора
|
||||
for i in 0...choices.length
|
||||
# Отсечение: если сумма подмножества превышает target, пропустить этот выбор
|
||||
next if total + choices[i] > target
|
||||
# Попытка: сделать выбор и обновить элемент и total
|
||||
state << choices[i]
|
||||
# Перейти к следующему выбору
|
||||
backtrack(state, target, total + choices[i], choices, res)
|
||||
# Откат: отменить выбор и восстановить предыдущее состояние
|
||||
state.pop
|
||||
end
|
||||
end
|
||||
|
||||
# ## Решить задачу суммы подмножеств I (с повторяющимися подмножествами) ###
|
||||
### Решить задачу суммы подмножеств I (с повторяющимися подмножествами) ###
|
||||
def subset_sum_i_naive(nums, target)
|
||||
state = [] # Состояние (подмножество)
|
||||
total = 0 # Сумма подмножеств
|
||||
@@ -1062,13 +1029,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="subset_sum_i.rb"
|
||||
=begin
|
||||
File: subset_sum_i.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: сумма подмножеств I ###
|
||||
### Алгоритм бэктрекинга: сумма подмножеств I ###
|
||||
def backtrack(state, target, choices, start, res)
|
||||
# Если сумма подмножества равна target, записать решение
|
||||
if target.zero?
|
||||
@@ -1090,35 +1051,7 @@ comments: true
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
File: subset_sum_i.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: сумма подмножеств I ###
|
||||
def backtrack(state, target, choices, start, res)
|
||||
# Если сумма подмножества равна target, записать решение
|
||||
if target.zero?
|
||||
res << state.dup
|
||||
return
|
||||
end
|
||||
# Обойти все варианты выбора
|
||||
# Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
|
||||
for i in start...choices.length
|
||||
# Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
|
||||
# Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
|
||||
break if target - choices[i] < 0
|
||||
# Попытка: сделать выбор и обновить target и start
|
||||
state << choices[i]
|
||||
# Перейти к следующему выбору
|
||||
backtrack(state, target - choices[i], choices, i, res)
|
||||
# Откат: отменить выбор и восстановить предыдущее состояние
|
||||
state.pop
|
||||
end
|
||||
end
|
||||
|
||||
# ## Решить задачу суммы подмножеств I ###
|
||||
### Решить задачу суммы подмножеств I ###
|
||||
def subset_sum_i(nums, target)
|
||||
state = [] # Состояние (подмножество)
|
||||
nums.sort! # Отсортировать nums
|
||||
@@ -1703,13 +1636,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="subset_sum_ii.rb"
|
||||
=begin
|
||||
File: subset_sum_ii.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: сумма подмножеств II ###
|
||||
### Алгоритм бэктрекинга: сумма подмножеств II ###
|
||||
def backtrack(state, target, choices, start, res)
|
||||
# Если сумма подмножества равна target, записать решение
|
||||
if target.zero?
|
||||
@@ -1735,39 +1662,7 @@ comments: true
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
File: subset_sum_ii.rb
|
||||
Created Time: 2024-05-22
|
||||
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Алгоритм бэктрекинга: сумма подмножеств II ###
|
||||
def backtrack(state, target, choices, start, res)
|
||||
# Если сумма подмножества равна target, записать решение
|
||||
if target.zero?
|
||||
res << state.dup
|
||||
return
|
||||
end
|
||||
|
||||
# Обойти все варианты выбора
|
||||
# Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
|
||||
# Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
|
||||
for i in start...choices.length
|
||||
# Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
|
||||
# Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
|
||||
break if target - choices[i] < 0
|
||||
# Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
|
||||
next if i > start && choices[i] == choices[i - 1]
|
||||
# Попытка: сделать выбор и обновить target и start
|
||||
state << choices[i]
|
||||
# Перейти к следующему выбору
|
||||
backtrack(state, target - choices[i], choices, i + 1, res)
|
||||
# Откат: отменить выбор и восстановить предыдущее состояние
|
||||
state.pop
|
||||
end
|
||||
end
|
||||
|
||||
# ## Решить задачу суммы подмножеств II ###
|
||||
### Решить задачу суммы подмножеств II ###
|
||||
def subset_sum_ii(nums, target)
|
||||
state = [] # Состояние (подмножество)
|
||||
nums.sort! # Отсортировать nums
|
||||
|
||||
Reference in New Issue
Block a user