Проблемы интервью (7 серии части)
Учитывая в общей сложности n
Монеты находят общее количество полных лестниц, которые могут быть построены.
Ряд лестниц – это те, где я
-th Row имеет я
монеты.
Например, приведены, верните 3, так как вы можете сформировать лестницу, как это:
* * * * * *
Дано, верните 3.
* * * * * * * * *
Обратите внимание, что 4 -й ряд недействителен, поскольку у него нет 4 монет.
Подход – 1: Бинарный поиск
Чтобы построить лестницу до k-th ряд, нам нужно:
1 + 2 + 3 + … +*(k + 1)/2 монеты.
Таким образом, нам нужно найти максимальный k, такой, что, k*(k + 1)/2.
Поскольку N является растущей функцией K, мы можем использовать бинарный поиск для решения этой проблемы.
Мы инициализируем низкий
и высоко
как 0
и n
соответственно. На каждом шаге мы рассчитываем Значение монет, требуемых с использованием формулы*(k + 1)/2 где k
это Средний элемент между низкий
и высоко
. Если требуемые монеты больше n
Значение Высокий
обновляется до k - 1
и если это меньше, чем n
, значение из низкий
обновляется до K + 1
Анкет Поскольку мы уменьшаем пространство поиска наполовину в каждом Итерация, временная сложность O (logn)
, где n – количество монет.
C ++ Код:
#includeusing namespace std; int arrangeCoins(int n) { long low = 0, high = n; while (low <= high) { long k = low + (high - low) / 2; long cur = k * (k + 1) / 2; if (cur == n) return (int)k; if (n < cur) { high = k - 1; } else { low = k + 1; } } return (int)high; } int main() { cout << 6 << " " << arrangeCoins(6) << endl; cout << 9 << " " << arrangeCoins(9) << endl; }
Код Python:
def arrangeCoins(n): low = 0 high = n while low <= high: k = low + (high - low) // 2 cur = k * (k + 1) // 2 if cur == n: return k if n < cur: high = k - 1 else: low = k + 1 return high if __name__ == '__main__': print(6, arrangeCoins(6)) # n = 6, prints 3 print(9, arrangeCoins(9)) # n = 9, prints 3
Сложность времени: O (logn)
Из -за бинарного поиска
Сложность пространства: O (1)
Подход – 2: Математика
Мы сформулировали уравнение:
k*(k + 1) / 2 <= n k^2 + k <= 2*n k^2 + k - 2*n <=0
Мы можем использовать формулу Sridharacarya для решения этого уравнения:
k = (-1 + sqrt(1 + 8n))/2
C ++ Код:
#include#include using namespace std; int arrangeCoins(int n) { int(-1 + sqrt(1 + (long)8 * n)) / 2; } int main() { cout << 6 << " " << arrangeCoins(6) << endl; cout << 9 << " " << arrangeCoins(9) << endl; }
Код Python:
def arrangeCoins(n): return int((-1 + ((1 + 8 * n) ** 0.5)) / 2) if __name__ == '__main__': print(6, arrangeCoins(6)) # n = 6, prints 3 print(9, arrangeCoins(9)) # n = 9, prints 3
Сложность времени: O (1)
Сложность пространства: O (1)
Проблемы интервью (7 серии части)
Оригинал: “https://dev.to/ayanb/maximum-height-when-coins-are-arranged-in-staircase-fashion-a-godaddy-interview-question-3jin”