Найдите недостающий номер

Постановка задачи

Вам дан массив положительных чисел от 1 до n, так что присутствуют все числа от 1 до n, кроме одного числа «x». Вы должны найти «х». Входной массив не отсортирован.

Например, давайте посмотрим на приведенный ниже массив.

Подсказка

  • Как бы вы вычислили сумму чисел от 1 до n?

Попробуйте сами

  • C ++
  • C ++
  • C ++
  • Java
  • Java
  • путь> Python
  • Python

  • JavaScript
  • JavaScript
  • Ruby
  • Ruby
 int find_missing (const vector  & input) {//TODO: Write - Your - Code return -1;} 

Решение

  • C ++
  • путь> путь > C ++
  • C ++
  • путь> Java
  • Java
  • Python
  • Python
  • JavaScript
  • JavaScript
  • Рубин
  • Рубин
 int find_missing (const vector  & input) {//вычисляем сумму всех элементов//во входном векторе auto sum_of_elements = std :: accumulate (input.begin (), input.end (), 0); //Отсутствует ровно 1 число int n = input. размер () + 1;  int фактическая_сумма = (п * (п + 1))/2;  return actual_sum - sum_of_elements;} недействительный тест (int n) {int missing_element = rand ()% n + 1;  вектор  v;  for (int i = 1; i  

Объяснение решения

Сложность времени выполнения

Линейная, O (n).

Сложность памяти

Константа, O ( 1).

Анализ решения

Наивное решение — просто искать каждое целое число от 1 до n во входном массиве, останавливая поиск как только появится недостающий номер. Поскольку входной массив не отсортирован, его временная сложность будет O ( n 2n^{2} n 2) .

Можете ли вы сделать лучше, чем O ( n 2 n ^ {2} n 2 )? Да.

Вы можете отсортировать массив, а затем выполнить линейное сканирование O (n), где вы сравните все последовательные элементы, чтобы найти недостающее число. Однако временная сложность этого алгоритма составляет O (n log n) из-за времени, затрачиваемого на сортировку.

Вы можете добиться большего. Вот линейное решение O (n), которое использует формулу суммы арифметических рядов.

Sum (1 — n) = n ( n + 1)2 frac {n (n + 1)} {2} 2 n (n + 1)

Вот шаги, чтобы найти недостающее число.

  1. Найдите сумму «sum_of_elements» всех чисел в массиве. Для этого потребуется линейное сканирование, O (n).
  2. Затем найдите сумму «ожидаемая_сумма» первых «n» чисел, используя формулу суммы арифметического ряда, т.е. (n * (n + 1)) /2.
  3. Разница между этими, например, «ожидаемая_ сумма — сумма_элементов», заключается в отсутствующем числе в массиве.
Оцените статью
nanomode.ru
Добавить комментарий