day8(力扣)猜数字大小(python描述)

题目描述:我们正在玩一个猜数字游戏。 游戏规则如下:我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。每次你猜错了,我会告诉你这个数字是大了还是小了。你调用一个预先定义好的接口 guess(int num),它会返回 3 个可能的结果(-1,1 或 0):

-1 : 我的数字比较小
 1 : 我的数字比较大
 0 : 恭喜!你猜对了!

示例 :

输入: n = 10, pick = 6
输出: 6

分析:说实话,虽然没看懂题目的 pick 和 n 到底代表着什么 ,但是一看他提供的内置函数小编嘴角微微上扬,因为这个可以直接暴力循环,当guess函数返回为 0 的时候肯定就是猜中了,直接返回答案就行,于是就有了下面戏剧性的一幕。
day8(力扣)猜数字大小(python描述)_第1张图片
小编当时还没反应过来,这是什么情况????后来冷静了一下,想了想,这是不是溢出了,或者是数字的类型不够长,存储不下了。于是小编就想起了当时C语言最常用的对付这一类查找的算法:二分查找,试试看到底是哪里出了问题。代码如下:

# The guess API is already defined for you.
# @param num, your guess
# @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
# def guess(num):

class Solution(object):
    def guessNumber(self, n):
    
     #   :type n: int
     #   :rtype: int

        low = 0
        high = n
        while low <= high:
            mid = (high - low) / 2 + low
            if guess(mid) == 0:
                return mid
            elif guess(mid) == 1:
                low = mid + 1
            else: 
                high = mid - 1

二分法很简单,假如你要处理的对象是一个数组,你要找到数组中的一个元素,我们可以采用对半分的思想,定义起始点:数组的第一个元素的位置(low)终点:数组最后一个元素的位置(high)中间点:(终点位置 - 起始点位置) / 2 + 起始点位置 (mid),如果猜的数字比中间的数字大,我们就把起始点移动到中间点右边第一个点的位置;如果猜的数字比中间点小,我们就把终点移动到中间点左边第一个点的位置;如此往复,直到终点跑到了起始点的左边(当二者位置相同的时候仍要继续比较,否则你就会少比较而这相同位置的这个点的值)。
虽然采用二分法之后提交就直接通过,但是小编仍然不知道为什么暴力法不行,如果是时间超出限制,他会提示时间超出限制,但是他给出的错误提示是答案错误。如果是数字存储问题,那么为什么二分法就可以存储的下这么大的数字而暴力法不可以呢???如果可以回答小编这个问题的话欢迎下边评论。

你可能感兴趣的:(LeetCode)