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

作者: Justin小贾同学 | 来源:发表于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