【问题标题】:Binary Search Doesn't work in this case?二进制搜索在这种情况下不起作用?
【发布时间】:2017-05-09 05:02:04
【问题描述】:

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美元。但是我查看了解决方案,在我看来它们都使用动态编程。我想知道为什么二进制搜索算法在这种情况下不起作用?

【问题讨论】:

标签: algorithm binary-search minimax


【解决方案1】:

通过二分搜索,您可以找到找到该号码所需的最少转数。但是在这个问题中,您必须考虑的成本不是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 解决方案。

【讨论】:

    【解决方案2】:

    这可能会有所帮助。二进制搜索应该可以工作。

    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; }
    

    【讨论】:

      【解决方案3】:

      由于一个重要因素,您的问题不适用于二进制搜索 - 二进制搜索的设计重点是减少查找特定数字所需的尝试次数。

      二分搜索只是最大限度地减少您需要进行的点击次数来找到您的号码(不取决于您点击的值)。它不能最小化任何其他因素。

      因此,如果您想找到必须支付的最低 $(您要达到的数字的总和),建议您使用动态编程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        相关资源
        最近更新 更多