Разбор задачи: Найди все пропавшие числа в массиве

Предложенный нами код решения:

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

Подход к решению:

Мы будем использовать сам массив для пометки встреченных чисел, изменяя знаки элементов массива. Это позволяет решить задачу без использования дополнительной памяти.

Шаги выполнения:

  1. Отметка встреченных чисел:
    • Каждый элемент массива nums[i] представляет собой число, которое должно быть в диапазоне от 1 до n. Мы будем использовать индекс, чтобы отметить, что число встречено.
    • Для каждого числа в массиве мы вычисляем индекс, который соответствует этому числу, используя формулу index = abs(num) - 1. Это работает, потому что числа в массиве находятся в пределах от 1 до n, а индексы массива начинаются с 0.
    • Мы смотрим на значение элемента массива по этому индексу. Если оно положительное, это означает, что число еще не встречалось, и мы меняем его знак на отрицательный, чтобы пометить его как встреченное.
  2. Поиск отсутствующих чисел:
    • После того как мы отметили все встреченные числа, положительные элементы в массиве будут указывать на числа, которые не встречались.
    • Мы проходим по массиву и добавляем в результат те числа, индексы которых содержат положительные значения.

Пример:

Предположим, у нас есть массив nums = [4, 3, 2, 7, 8, 2, 3, 1].

  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].
  2. Проходим по массиву и ищем положительные значения:
    • Индексы, содержащие положительные значения, указывают на отсутствующие числа. В данном случае индексы 4 и 5 содержат положительные значения, что соответствует числам 5 и 6.
  3. Ответ: Массив отсутствующих чисел: [5, 6].

 



Комментарии

xsnm_avatar
xsnm
,
6 месяцев, 2 дня назад

Функция 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']
 

0

Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии