1. Minimax Recursion with Binary Search
Intuition
For each floor x from 1 to n, take the worst case between breaking (x-1 floors below, k-1 eggs) and surviving (n-x floors above, k eggs).
Algorithm
- Define
solve(k, n). - Base Cases: if
n <= 1, returnn; ifk == 1, returnn. - Initialize
minAttempts = infinity. - For
x = 1ton: -
worstCase = 1 + max(solve(k - 1, x - 1), solve(k, n - x)) -
minAttempts = min(minAttempts, worstCase). - Return
minAttempts.
#include <iostream>#include <vector>#include <algorithm> using namespace std; int memo[105][10005]; int solveMinimax(int k, int n) { if (n <= 1 || k == 1) return n; if (memo[k][n] != 0) return memo[k][n]; int low = 1, high = n, ans = n; while (low <= high) { int mid = (low + high) / 2; int broken = solveMinimax(k - 1, mid - 1); int notBroken = solveMinimax(k, n - mid); ans = min(ans, 1 + max(broken, notBroken)); if (broken < notBroken) { low = mid + 1; } else { high = mid - 1; } } return memo[k][n] = ans;} int superEggDropMinimax(int k, int n) { return solveMinimax(k, n);} int main() { int k = 2, n = 6; cout << "Min Drops (Minimax + Binary Search): " << superEggDropMinimax(k, n) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(k * n^2) naive, O(k * n log n) with binary search - Space complexity:
O(k * n) memoization