Программа курса:
Разбор задачи: Найди все пропавшие числа в массиве
Предложенный нами код решения:
def find_disappeared_numbers(nums):
"""
:param nums: список целых чисел, где каждый элемент находится в диапазоне [1, n]
:return: список всех чисел из диапазона [1, n], которые не встречаются в массиве nums
"""
n = len(nums)
result = []
# Отметим элементы, которые встречаются, путем изменения значений на отрицательные
for num in nums:
index = abs(num) - 1
if nums[index] > 0:
nums[index] = -nums[index]
# В конце положительные значения указывают на отсутствующие числа
for i in range(n):
if nums[i] > 0:
result.append(i + 1)
return resultПодход к решению:
Мы будем использовать сам массив для пометки встреченных чисел, изменяя знаки элементов массива. Это позволяет решить задачу без использования дополнительной памяти.
Шаги выполнения:
- Отметка встреченных чисел:
- Каждый элемент массива
nums[i]представляет собой число, которое должно быть в диапазоне от 1 доn. Мы будем использовать индекс, чтобы отметить, что число встречено. - Для каждого числа в массиве мы вычисляем индекс, который соответствует этому числу, используя формулу
index = abs(num) - 1. Это работает, потому что числа в массиве находятся в пределах от 1 доn, а индексы массива начинаются с 0. - Мы смотрим на значение элемента массива по этому индексу. Если оно положительное, это означает, что число еще не встречалось, и мы меняем его знак на отрицательный, чтобы пометить его как встреченное.
- Каждый элемент массива
- Поиск отсутствующих чисел:
- После того как мы отметили все встреченные числа, положительные элементы в массиве будут указывать на числа, которые не встречались.
- Мы проходим по массиву и добавляем в результат те числа, индексы которых содержат положительные значения.
Пример:
Предположим, у нас есть массив nums = [4, 3, 2, 7, 8, 2, 3, 1].
- Проходим по массиву и меняем знаки:
- Встретили 4 — меняем знак элемента по индексу
3(4-1), получаем:[4, 3, 2, -7, 8, 2, 3, 1]. - Встретили 3 — меняем знак элемента по индексу
2(3-1), получаем:[4, 3, -2, -7, 8, 2, 3, 1]. - Встретили 2 — меняем знак элемента по индексу
1(2-1), получаем:[4, -3, -2, -7, 8, 2, 3, 1]. - Встретили 7 — меняем знак элемента по индексу
6(7-1), получаем:[4, -3, -2, -7, 8, 2, -3, 1]. - Встретили 8 — меняем знак элемента по индексу
7(8-1), получаем:[4, -3, -2, -7, 8, 2, -3, -1]. - Встретили 2 (дубликат) — индекс 1 уже отмечен, ничего не меняем.
- Встретили 3 (дубликат) — индекс 2 уже отмечен, ничего не меняем.
- Встретили 1 — меняем знак элемента по индексу
0(1-1), получаем:[-4, -3, -2, -7, 8, 2, -3, -1].
- Встретили 4 — меняем знак элемента по индексу
- Проходим по массиву и ищем положительные значения:
- Индексы, содержащие положительные значения, указывают на отсутствующие числа. В данном случае индексы 4 и 5 содержат положительные значения, что соответствует числам 5 и 6.
- Ответ: Массив отсутствующих чисел:
[5, 6].
xsnm
,Функция find_disappeared_numbers_may. Время выполнения 0.0000000000 секунд
Ввод: [4, 3, 2, 9, 15, 2, 3, 1]
Результат: = В диапазоне (1-n), нет элементов [5, 6, 7, 8] и есть элементы за пределами диапазона ['9', '15']
Функция find_disappeared_numbers. Время выполнения 0.0000000000 секунд
Ввод: [4, 3, 2, 9, 15, 2, 3, 1]
Результат: = В диапазоне (1-n), есть элементы находится за пределами диапазона от 1 до n, ['9', '15']