Автор оригинала: Shubham Sayon.
🏗️ Теги компании : Google
Постановка проблемы
Дано массив Nums
N
целые числа. Возвращение Массив, содержащий все целые числа в диапазоне [1, n]
которые не появляются в Nums
Отказ ✒️ здесь, Nums [I]
находится в диапазоне [1, n]
Отказ
⚠️ Ограничения :
N.Length
1
51 [я]
💡examples.
Давайте посмотрим на некоторые примеры для улучшения нашего понимания этой проблемы.
✏️ Example 1 Input: nums = [4,3,2,7,8,2,3,1] Output: [5,6] Explanation: The length of the array is 8 and the only numbers missing from it within the range 1 to 8 are '5' and '6'. ✏️ Example 2 Input: nums = [1,1] Output: [2] Explanation: The length of the array is 2 and the only number missing from it within the range 1 to 2 is '2'. ✏️ Example 3 Input: nums = [1,2,3,4,5] Output: [] Explanation: All numbers within the range 1 to 5 are present in the array. ✏️ Example 4 Input: [4,4,4,4] Output: [1,2,3] Explanation: The length of the array is 4 and the numbers missing from it within the range 1 to 4 are '1', '2' and '3'.
🖊️PYPHON ONE-LILER С помощью списка + комплект + диапазон
❖ Подход: Идея здесь – использовать Установить в пределах Диапазон (1, Len (Nums) + 1) это позволяет вам получить Уникальный Элементы в Nums
от 1 до n
а затем вычесть Set (Nums) от него. Это даст вам цифры, которые не были в данном диапазоне.
Примечание:
Давайте посмотрим на следующую иллюстрацию, чтобы понять предложенную концепцию:
Теперь давайте посмотрим на код Отказ
def missing_numbers(nums): return list(set(range(1, len(nums)+1))-set(nums))
Легкий! Не так ли? 😀.
Давайте запустим этот код на наших примерах:
#Example 1 nums = [4,3,2,7,8,2,3,1] print(missing_numbers(nums)) #[5,6] #Example 2 nums = [1,1] print(missing_numbers(nums)) #[2] #Example 3 nums = [1,2,3,4,5] print(missing_numbers(nums)) #[] #Example 4 nums = [4,4,4,4] print(missing_numbers(nums)) #[1,2,3]
Ура! 😃 Код передал все тестовые случаи.
❖ Анализ сложности
- Сложность времени: Честно говоря, мы просто находим разницу между двумя наборами в этом решении. Следовательно, сложность выполнения этого решения является O (n) Отказ
- Космическая сложность: O (n)
Но мы можем избежать использовать набор и как-то маркировать входной массив, который говорит нам, какие номера видны и что нет? Это позволит нам Избегайте использования дополнительное пространство.
Тидбит : Python Диапазон ()
Функция создает передачу последующих целых чисел в данном диапазоне значений. Вы можете пройти либо только Стоп
аргумент, в этом случае Диапазон
Объект будет включать все целые числа из 0
к Стоп
(Исключенный). Или вы можете пройти Начать
, Стоп
и шаг
Аргументы, в этом случае объект диапазона поедет из Начать
к шаг
Использование данного шаг
размер. Например, Диапазон (3)
Результаты в 0, 1, 2
и Диапазон (2, 7, 2)
Результаты в 2, 4, 6
Отказ
Рекомендуемая статья: Функция Python Range () – полезное иллюстрированное руководство
🖊️Optimal Решение: без использования дополнительного пространства
❖ Подход
Идея состоит в том, чтобы использовать данный список/массив и отслеживать посещенные номера. Поскольку все числа являются положительными целыми числами, вы можете отметить наличие каждого числа, которое посещается отрицанием числа в индексе, равном текущему номеру. Это в основном означает, что вы отмечаете индекс, равный (№ 1)
Отказ Если номер в этом индексе уже отрицается, вы ничего не делаете. Наконец, просто верните индексы (индекс + 1 для числа)
где числа все еще положительны и представляют недостающие номера в диапазоне.
Смущенный? Следующие иллюстрации сделают все возможное.
❖ Объяснение:
Nums = [4, 3, 2, 7, 8, 2, 3, 1]
Отказ Теперь давайте пережим через массив Nums
Отказ
На
ИТЕР
,Текущий номер: | 4
| (|.. Здесь относится к принятию абсолютное значение)
Номер (текущий номер - 1): 7
- После отрицания:
Nums = [4, 3, 2, -7, 8, 2, 3, 1]
На
елее
Текущий номер: | 3 |
Номер в (текущий номер - 1): 2
- После отрицания:
Nums = [4, 3, -2, -7, 8, 2, 3, 1]
На
елее
Текущий номер: | -2 |
Номер (текущий номер - 1): 3
- После отрицания:
Nums = [4, -3, -2, -7, 8, 2, 3, 1]
На
елее
Текущий номер: | -7 |
Номер (текущий номер - 1): 3
- После отрицания:
Nums = [4, -3, -2, -7, 8, 2, -3, 1]
На
елее
Текущий номер: | 8 |
Номер (текущий номер - 1): 1
- После отрицания:
Nums = [4, -3, -2, -7, 8, 2, -3, -1]
На
елее
Текущий номер: | 2 |
Номер в (текущий номер - 1): -3
- Массив остается без изменений:
Nums = [4, -3, -2, -7, 8, 2, -3, -1]
На
елее
Текущий номер: | -3 |
Номер в (текущий номер - 1): -2
- Массив остается без изменений:
Nums = [4, -3, -2, -7, 8, 2, -3, -1]
На
елее
Текущий номер: | -1 |
Номер в (текущий номер - 1): 4
- После отрицания:
Nums = [-4, -3, -2, -7, 8, 2, -3, -1]
Теперь индексы, на которых есть еще положительные числа, являются числами (индекс + 1) Это не было в массиве.
❖ Давайте посмотрим на код.
def missing_numbers(nums): for n in nums: i = abs(n) - 1 nums[i] = -abs(nums[i]) res = [] for i, num in enumerate(nums): if num > 0: res.append(i+1) return res
❖ Тестовые случаи
Давайте пойдем вперед и выполним тестовые случаи в нашем коде, чтобы проверить подлинность этого подхода:
# Example 1 nums = [4, 3, 2, 7, 8, 2, 3, 1] print(missing_numbers(nums)) # [5,6] # Example 2 nums = [1, 1] print(missing_numbers(nums)) # [2] # Example 3 nums = [1, 2, 3, 4, 5] print(missing_numbers(nums)) # [] # Example 4 nums = [4, 4, 4, 4] print(missing_numbers(nums)) # [1,2,3]
❖ Анализ сложности
- Сложность времени: Требуется N Итерации для вычисления решения. Следовательно, сложность выполнения этого кода является O (n) Отказ
Космическая сложность: Это решение имеет пространственную сложность O (1) Отказ
- Вам может быть интересно, что это не O (1) пространство, потому что вы используете
res = []
Отказ Строго говоря, да, вы правы! Но, «Вы можете предположить, что возвращенный список не считается дополнительным пространством в данном вопросе». Итак, это дает вам немного свободы.
- Вам может быть интересно, что это не O (1) пространство, потому что вы используете
🖊️solution 3.
Есть еще один подход к решению данной проблемы.
❖ Подход
- Вы можете переоценить данный массив и добавить к существующему числу в позиции, подразумеваемой каждым элементом. Таким образом, позиции, подразумеваемые числами, присутствующими в массиве, будут определенно больше, чем n (то есть наименьшее число 1 и 1 + n> n).
- Поэтому во второй итерации вам просто нужно сообщать числам, меньше или равных n, чтобы вернуть номера, которые отсутствуют в данном списке/массиве.
Давайте посмотрим на код:
def missing_numbers(nums): N = len(nums) for i in range(len(nums)): x = nums[i] % N print(nums[x-1]) nums[x - 1] += N print(nums) x=[] for i in range(len(nums)): if nums[i] <= N: print(i) x.append(i+1) print(x) return x
Теперь давайте посмотрим на следующий пример для визуализации вышеуказанного решения. Подумайте, что данный список – Nums = [1, 3, 3]
Отказ Следующие таблицы демонстрируют пошаговый сухой пробег этого списка при выполнении приведенного выше кода.
❖ Тестовые случаи
[4, 3, 2, 7, 8, 2, 3, 1] | [5, 6] |
[1, 1] | [2] |
[1, 2, 3, 4, 5] | [] |
[4, 4, 4, 4] | [1, 2, 3] |
❖ Анализ сложности
- Сложность времени: На)
- Космическая сложность: O (1)
Заключение
Я надеюсь, что вам понравилось этот опрос кодирования. Пожалуйста, оставайся настроенными и Подписаться Для более интересных проблем кодирования.
Рекомендуется: Академия компьютерной науки Finxter
- Вы хотите быстро освоить самые популярные Python IDE?
- Этот курс приведет вас от новичка к эксперту в Пычарме в ~ 90 минут.
- Для любого разработчика программного обеспечения имеет решающее значение для освоения IDE хорошо, писать, тестировать и отлаживать высококачественный код с небольшим усилием.
Присоединяйтесь к Pycharm MasterClass Сейчас и мастер Pycharm на завтра!
Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.
Вы можете связаться со мной @: