mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-16 11:02:09 +08:00
build
This commit is contained in:
@@ -339,13 +339,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="binary_search.rb"
|
||||
=begin
|
||||
File: binary_search.rb
|
||||
Created Time: 2024-04-09
|
||||
Author: Blue Bean (lonnnnnnner@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Бинарный поиск (двусторонне замкнутый интервал) ###
|
||||
### Бинарный поиск (двусторонне замкнутый интервал) ###
|
||||
def binary_search(nums, target)
|
||||
# Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
|
||||
i, j = 0, nums.length - 1
|
||||
@@ -669,35 +663,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="binary_search.rb"
|
||||
=begin
|
||||
File: binary_search.rb
|
||||
Created Time: 2024-04-09
|
||||
Author: Blue Bean (lonnnnnnner@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Бинарный поиск (двусторонне замкнутый интервал) ###
|
||||
def binary_search(nums, target)
|
||||
# Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
|
||||
i, j = 0, nums.length - 1
|
||||
|
||||
# Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
|
||||
while i <= j
|
||||
# Теоретически числа в Ruby могут быть сколь угодно большими (ограничены только объемом памяти), поэтому не нужно учитывать переполнение больших чисел
|
||||
m = (i + j) / 2 # Вычислить индекс середины m
|
||||
|
||||
if nums[m] < target
|
||||
i = m + 1 # Это означает, что target находится в интервале [m+1, j]
|
||||
elsif nums[m] > target
|
||||
j = m - 1 # Это означает, что target находится в интервале [i, m-1]
|
||||
else
|
||||
return m # Целевой элемент найден, вернуть его индекс
|
||||
end
|
||||
end
|
||||
|
||||
-1 # Целевой элемент не найден, вернуть -1
|
||||
end
|
||||
|
||||
# ## Бинарный поиск (лево замкнутый, право открытый интервал) ###
|
||||
### Бинарный поиск (лево замкнутый, право открытый интервал) ###
|
||||
def binary_search_lcro(nums, target)
|
||||
# Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
|
||||
i, j = 0, nums.length
|
||||
|
||||
@@ -212,15 +212,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="binary_search_edge.rb"
|
||||
=begin
|
||||
File: binary_search_edge.rb
|
||||
Created Time: 2024-04-09
|
||||
Author: Blue Bean (lonnnnnnner@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative './binary_search_insertion'
|
||||
|
||||
# ## Бинарный поиск самого левого target ###
|
||||
### Бинарный поиск самого левого target ###
|
||||
def binary_search_left_edge(nums, target)
|
||||
# Эквивалентно поиску точки вставки target
|
||||
i = binary_search_insertion(nums, target)
|
||||
@@ -472,26 +464,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="binary_search_edge.rb"
|
||||
=begin
|
||||
File: binary_search_edge.rb
|
||||
Created Time: 2024-04-09
|
||||
Author: Blue Bean (lonnnnnnner@gmail.com)
|
||||
=end
|
||||
|
||||
require_relative './binary_search_insertion'
|
||||
|
||||
# ## Бинарный поиск самого левого target ###
|
||||
def binary_search_left_edge(nums, target)
|
||||
# Эквивалентно поиску точки вставки target
|
||||
i = binary_search_insertion(nums, target)
|
||||
|
||||
# target не найден, вернуть -1
|
||||
return -1 if i == nums.length || nums[i] != target
|
||||
|
||||
i # Найти target и вернуть индекс i
|
||||
end
|
||||
|
||||
# ## Бинарный поиск самого правого target ###
|
||||
### Бинарный поиск самого правого target ###
|
||||
def binary_search_right_edge(nums, target)
|
||||
# Преобразовать задачу в поиск самого левого target + 1
|
||||
i = binary_search_insertion(nums, target + 1)
|
||||
|
||||
@@ -293,13 +293,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="binary_search_insertion.rb"
|
||||
=begin
|
||||
File: binary_search_insertion.rb
|
||||
Created Time: 2024-04-09
|
||||
Author: Blue Bean (lonnnnnnner@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Бинарный поиск точки вставки (без повторяющихся элементов) ###
|
||||
### Бинарный поиск точки вставки (без повторяющихся элементов) ###
|
||||
def binary_search_insertion_simple(nums, target)
|
||||
# Инициализировать двусторонне замкнутый интервал [0, n-1]
|
||||
i, j = 0, nums.length - 1
|
||||
@@ -644,34 +638,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="binary_search_insertion.rb"
|
||||
=begin
|
||||
File: binary_search_insertion.rb
|
||||
Created Time: 2024-04-09
|
||||
Author: Blue Bean (lonnnnnnner@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Бинарный поиск точки вставки (без повторяющихся элементов) ###
|
||||
def binary_search_insertion_simple(nums, target)
|
||||
# Инициализировать двусторонне замкнутый интервал [0, n-1]
|
||||
i, j = 0, nums.length - 1
|
||||
|
||||
while i <= j
|
||||
# Вычислить индекс середины m
|
||||
m = (i + j) / 2
|
||||
|
||||
if nums[m] < target
|
||||
i = m + 1 # target находится в интервале [m+1, j]
|
||||
elsif nums[m] > target
|
||||
j = m - 1 # target находится в интервале [i, m-1]
|
||||
else
|
||||
return m # Найти target и вернуть точку вставки m
|
||||
end
|
||||
end
|
||||
|
||||
i # target не найден, вернуть точку вставки i
|
||||
end
|
||||
|
||||
# ## Бинарный поиск точки вставки (с повторяющимися элементами) ###
|
||||
### Бинарный поиск точки вставки (с повторяющимися элементами) ###
|
||||
def binary_search_insertion(nums, target)
|
||||
# Инициализировать двусторонне замкнутый интервал [0, n-1]
|
||||
i, j = 0, nums.length - 1
|
||||
|
||||
@@ -228,13 +228,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="two_sum.rb"
|
||||
=begin
|
||||
File: two_sum.rb
|
||||
Created Time: 2024-04-09
|
||||
Author: Blue Bean (lonnnnnnner@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Метод 1: полный перебор ###
|
||||
### Метод 1: полный перебор ###
|
||||
def two_sum_brute_force(nums, target)
|
||||
# Два вложенных цикла, временная сложность O(n^2)
|
||||
for i in 0...(nums.length - 1)
|
||||
@@ -527,25 +521,7 @@ comments: true
|
||||
=== "Ruby"
|
||||
|
||||
```ruby title="two_sum.rb"
|
||||
=begin
|
||||
File: two_sum.rb
|
||||
Created Time: 2024-04-09
|
||||
Author: Blue Bean (lonnnnnnner@gmail.com)
|
||||
=end
|
||||
|
||||
# ## Метод 1: полный перебор ###
|
||||
def two_sum_brute_force(nums, target)
|
||||
# Два вложенных цикла, временная сложность O(n^2)
|
||||
for i in 0...(nums.length - 1)
|
||||
for j in (i + 1)...nums.length
|
||||
return [i, j] if nums[i] + nums[j] == target
|
||||
end
|
||||
end
|
||||
|
||||
[]
|
||||
end
|
||||
|
||||
# ## Метод 2: вспомогательная хеш-таблица ###
|
||||
### Метод 2: вспомогательная хеш-таблица ###
|
||||
def two_sum_hash_table(nums, target)
|
||||
# Вспомогательная хеш-таблица, пространственная сложность O(n)
|
||||
dic = {}
|
||||
|
||||
Reference in New Issue
Block a user