https://leetcode.com/problems/guess-number-higher-or-lower-ii/#/description
我们正在玩猜猜游戏。游戏如下:
我从1到n选择一个数字。你必须猜测我选择了哪个号码。
每当你猜错了,我会告诉你我选择的号码 是更高还是更低。
然而,当你猜出一个特定的数字x,你猜错了, 你支付$ x。当你猜到我选择的数字时,你赢了比赛。
如果特定n≥1,找出你需要多少钱(至少)来保证获胜。
我正在练习这个问题。我认为这个问题可以用二进制搜索来解决。特别是,对于最坏的情况,总是可以假设该数字位于每个分割的右半部分。
示例:说n = 5。那你有
[1,2,3,4,5]。
首先尝试= 3,然后第二次尝试= 4.这将给你一个7美元的最坏情况。但我看过这些解决方案,在我看来他们都使用动态编程。我想知道二进制搜索算法在这种情况下怎么不起作用?
答案 0 :(得分:3)
使用二进制搜索,您可以找到需要花费的最小转弯数来查找数字。但在这个问题中,您需要考虑的成本不是number of turns
,而是由min sum that you pay in worst case
if you guess wrong, you pay $x
以下是二分搜索不起作用的示例:
[1,2,3,4]
在最坏的情况下使用BS
pick(2) -> decision: target is bigger
-> pick(3) -> decision: target is bigger [if decision is smaller thats not worst case]
-> pick(4) -> done
Total cost = 2+3 = 5
在最佳策略中:
pick(3) -> decision: smaller [if decision is bigger thats not worst case]
-> pick(1) -> decision: bigger [if decision is smaller thats not worst case]
-> pick(2) -> done
Total cost = 3+1 = 4
因此,对于最佳策略,您需要考虑动态编程解决方案。既然你的问题是为什么二进制搜索不能作为最佳策略在这里工作,我将把我的答案留给这只展示一个例子,而不是描述DP解决方案。
答案 1 :(得分:0)
这可能会有所帮助。二进制搜索应该有效。
public int guessNumber(int n)
{
int low=1;
int high=n;
while(low <= high){
int mid = low+((high-low)/2);
int result = guess(mid);
if(result==0)
{
return mid;
}
else if(result==1)
{
low = mid+1;
}
else
{
high=mid-1;
}
}
return -1; }
答案 2 :(得分:0)
您的问题不适用于二进制搜索,因为一个重要因素 - 二元搜索旨在减少您需要尝试查找特定数字的尝试次数。
二进制搜索只会最大限度地减少您查找号码所需的点击次数(不取决于您要点击的值)。它不能最小化任何其他因素。
因此,如果您想找到最低$(您正在击中的数字总和),您必须支付最好建议您使用动态编程。