В этой статье мы углубимся в проблему «Наименьшего диапазона II» и рассмотрим различные методы ее решения. Мы предоставим примеры кода вместе с пояснениями для каждого подхода. Давайте начнем!
Описание задачи:
Задача «Наименьший диапазон II» включает в себя массив целых чисел. Вам нужно выбрать число K из массива и прибавить или вычесть K из каждого элемента массива. Цель состоит в том, чтобы минимизировать разницу между максимальным и минимальным значениями в модифицированном массиве. Ваша задача — найти минимально возможный диапазон после модификаций.
Метод 1: подход грубой силы
Подход грубой силы предполагает перебор всех возможных значений K и расчет диапазона для каждой итерации. Мы можем реализовать этот подход с помощью вложенных циклов.
def smallest_range_ii(arr):
min_range = float('inf')
for k in range(max(arr) + 1):
modified_arr = [x + k for x in arr] + [x - k for x in arr]
min_range = min(min_range, max(modified_arr) - min(modified_arr))
return min_range
Метод 2: сортировка
Другой подход заключается в сортировке массива в порядке возрастания. Затем мы можем перебрать отсортированный массив и вычислить диапазон для каждой возможной точки разделения. Для определения диапазона мы берем максимум правого подмассива и минимум левого подмассива.
def smallest_range_ii(arr):
arr.sort()
min_range = arr[-1] - arr[0]
for i in range(len(arr) - 1):
max_val = max(arr[-1], arr[i] + 2 * k)
min_val = min(arr[0] + 2 * k, arr[i + 1])
min_range = min(min_range, max_val - min_val)
return min_range
Метод 3: оптимизированный подход к сортировке
Мы можем оптимизировать предыдущий подход, избегая ненужных вычислений. Вместо вычисления максимального и минимального значений для каждой точки разделения мы можем предварительно рассчитать их вне цикла.
def smallest_range_ii(arr):
arr.sort()
min_range = arr[-1] - arr[0]
max_val = arr[-1]
min_val = arr[0]
for i in range(len(arr) - 1):
max_val = max(max_val, arr[i] + 2 * k)
min_val = min(min_val, arr[i + 1])
min_range = min(min_range, max_val - min_val)
return min_range
Метод 4. Математический подход
Математический подход включает в себя поиск максимального и минимального значений в массиве и расчет диапазона непосредственно с помощью формулы.
def smallest_range_ii(arr):
max_val = max(arr)
min_val = min(arr)
min_range = max_val - min_val
for i in range(len(arr)):
max_val = max(max_val, arr[i] - k * 2)
min_val = min(min_val, arr[i] + k * 2)
min_range = min(min_range, max_val - min_val)
return min_range
В этой статье мы рассмотрели несколько методов решения проблемы «Наименьшего диапазона II». Мы обсудили грубую силу, сортировку, оптимизированную сортировку и математические подходы, приведя примеры кода для каждого метода. В зависимости от размера массива и конкретных требований разные методы могут обеспечивать разный уровень эффективности. Не стесняйтесь экспериментировать с этими подходами и выбирайте тот, который лучше всего соответствует вашим потребностям.
Не забудьте учитывать такие факторы, как временная сложность и ограничения ввода, чтобы определить наиболее подходящий метод для вашего варианта использования. Используя эти методы, вы сможете улучшить свои навыки решения проблем, одновременно эффективно решая задачу «Наименьший диапазон II».