Автор оригинала: Shubham Sayon.
🏗️ Теги компании : Google
Постановка проблемы
Дано массив Nums N целые числа. Возвращение Массив, содержащий все целые числа в диапазоне [1, n] которые не появляются в Nums Отказ ✒️ здесь, Nums [I] находится в диапазоне [1, n] Отказ
⚠️ Ограничения :
N.Length151 [я]
💡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.
Вы можете связаться со мной @: