0
点赞
收藏
分享

微信扫一扫

【菜菜的刷题日记】374.猜数字大小

八怪不姓丑 2022-01-20 阅读 49

请添加图片描述

系列索引:【菜菜的刷题日记】被LeetCode用Python狂虐的那段日子

【题目】

猜数字游戏的规则如下:

每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。

如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。

你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):

-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num

返回我选出的数字。

  • 难度:简单

题目链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower/

【我的代码】

本来想摆,但一想到都坚持了这么多天了不能断火呀,既然写了题就顺道把题解奉上,今日事今日毕!
个人水平有限,大佬勿嘲 [/抱拳]
在这里插入图片描述
主要是双指针的思想。

class Solution:
    def guessNumber(self, n: int) -> int:
        i = 0
        j = n+1
        while i < j:
            point = int(i+(j-i)/2) #参考下面的最好写成 point = i + (j - i) // 2 
            if guess(point) == 0:
                return point
            elif guess(point) == -1:
                j = point
            elif guess(point) == 1:
                i = point

我觉得算法效率低也可能是我重复调用guess函数造成的。
在这里插入图片描述
后面我又试了一次,果然啊,看来一些小细节还是会影响很大效率的。

class Solution:
    def guessNumber(self, n: int) -> int:
        i = 0
        j = n+1
        while i < j:
            point = i+(j-i)//2
            temp = guess(point)
            if temp == 0:
                return point
            elif temp == -1:
                j = point
            elif temp == 1:
                i = point

【参考代码1】二分查找

其实这道题大家看看也就图一乐,考察的就是单纯地分析思维。某大佬只是和我用的指针初始位置不同,我是放在了1~n的两端,下面代码则是从其本身开始并结束的。

class Solution:
    def guessNumber(self, n: int) -> int:
        left = 1
        right = n
        while left <= right:
            mid = left + (right - left) // 2
            ans = guess(mid)
            if ans == 1:
                left = mid + 1
            elif ans == -1:
                right = mid - 1
            else:
                return mid
        return 0

【参考代码2】官方题解

二分时,记当前区间为 [left,right],初始时 left=1,right=n。记区间中间元素为 mid,若有 guess(mid)≤0 则说明 pick∈[left,mid],否则 pick∈[mid+1,right]。当区间左右端点相同时,则说明我们找到了答案,退出循环。

class Solution:
    def guessNumber(self, n: int) -> int:
        left, right = 1, n
        while left < right:
            mid = (left + right) // 2
            if guess(mid) <= 0:
                right = mid   # 答案在区间 [left, mid] 中
            else:
                left = mid + 1   # 答案在区间 [mid+1, right] 中
        
        # 此时有 left == right,区间缩为一个点,即为答案
        return left
        

【思考】

print('Good Night')

举报

相关推荐

0 条评论