高楼扔鸡蛋-memorization search
[TOC]
题解:
这是一道经典的谷歌面试题,某公司今天的笔试题出了这道题(只不过扔的不是鸡蛋)。
理解题意
这道题是总共有N层楼,K个鸡蛋,找到鸡蛋摔破的极限楼层。最小需要尝试多少次,
(表示我第一次看到这道题,以为是一道数学题,并且还想眼巴巴的算出来。)
考虑状态转移,很容易想到动态规划。
假设从h楼摔下,如果摔碎,则状态变为:(K-1, h-1) (即K-1个鸡蛋,总共有h-1楼)
如果没摔碎,则状态变为:(K, N-h)
由此很容易写出递推式:
$$dp[k][n] = min(1+max(dp[k-1][i-1], dp[k][n-i])) \ i=1…n $$
由递推式得到代码:
1 | class Solution { |
递归版:
1 | class Solution { |
这样会超时,优化!从迭代版的代码可以看出,时间复杂度为 $O(KN^2)$,其中搜索$dp[k][n] = min(1+max(dp[k-1][i-1], dp[k][n-i])) \ i=1…n $中的i可以用二分搜索。从而将时间复杂度将为$O(KNlogN)$.
1 | class Solution { |
递归版:
1 | class Solution { |