一起学算法-374. 猜数字大小

作者: 小杨同学97 | 来源:发表于2021-05-25 21:43 被阅读0次

一、题目

LeetCode-374. 猜数字大小
链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower/

难度:简单
猜数字游戏的规则如下:

  • 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
  • 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。

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

  • -1:我选出的数字比你猜的数字小 pick < num
  • 1:我选出的数字比你猜的数字大 pick > num
  • 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
    返回我选出的数字。
示例 1:
输入:n = 10, pick = 6
输出:6

示例 2:
输入:n = 1, pick = 1
输出:1

示例 3:
输入:n = 2, pick = 1
输出:1

示例 4:
输入:n = 2, pick = 2
输出:2
 

提示:
1 <= n <= 2^31 - 1
1 <= pick <= n

二、解题思路

暴力枚举或者二分查找,把可能的值通过API去验证。
创建两个指针,left=1,right = n。
mid = left + (right - left)/2,通过api验证当前mid的值得到res。
如果res == 0,直接返回mid。
如果res == -1,说明我们猜的数大了,解在左半部分。
如果res == 1,说明我们猜的数小了,解在右半部分。

三、实现过程

c++

/** 
 * Forward declaration of guess API.
 * @param  num   your guess
 * @return       -1 if num is lower than the guess number
 *                1 if num is higher than the guess number
 *               otherwise return 0
 * int guess(int num);
 */

class Solution {
public:
    int guessNumber(int n) {
        int left = 1,right = n,mid,res;
        while(left <= right){
            mid = left + (right - left)/2;
            res = guess(mid);
            if(res == 0){
                break;
            }
            if(res < 0){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return mid;
    }
};

PHP

/** 
 * The API guess is defined in the parent class.
 * @param  num   your guess
 * @return       -1 if num is lower than the guess number
 *                1 if num is higher than the guess number
 *               otherwise return 0
 * public function guess($num){}
 */

class Solution extends GuessGame {
    /**
     * @param  Integer  $n
     * @return Integer
     */
    function guessNumber($n) {
        $left = 1;
        $right = $n;
    while($left <= $right){
        $mid = (int)($left + ($right - $left)/2);
        $res = $this->guess($mid);
        if($res == 0){
            return $mid;
        }
        if($res < 0){
            $right = $mid - 1;
        }else{
            $left = $mid + 1;
        }
    }
    }
}

JavaScript

/** 
 * Forward declaration of guess API.
 * @param {number} num   your guess
 * @return              -1 if num is lower than the guess number
 *                       1 if num is higher than the guess number
 *                       otherwise return 0
 * var guess = function(num) {}
 */

/**
 * @param {number} n
 * @return {number}
 */
var guessNumber = function(n) {
    var left = 1,right = n,mid,res;
    while(left <= right){
        mid = Math.floor(left + (right - left)/2);
        res = guess(mid);
        if(res == 0){
            return mid;
        }
        if(res < 0){
            right = mid - 1;
        }else{
            left = mid + 1;
        }
    }
};

四、小结

  1. 时间复杂度:O(logN),其中N是数字n的值。
  2. 空间复杂度:O(1)

相关文章

网友评论

    本文标题:一起学算法-374. 猜数字大小

    本文链接:https://www.haomeiwen.com/subject/sczcsltx.html