zoukankan      html  css  js  c++  java
  • [leetcode]374. Guess Number Higher or Lower

    这是leetcode第374题

    We are playing the Guess Game. The game is as follows:
    I pick a number from 1 to n. You have to guess which number I picked.
    Every time you guess wrong, I'll tell you whether the number is higher or lower.
    You call a pre-defined API guess(int num) which returns 3 possible results (-1, 1, or 0):

    -1 : My number is lower
    1 : My number is higher
    0 : Congrats! You got it!

    递归二分查找

    看完题目,我的第一想法是,递归二分查找。于是很快就写出如下代码。
    Submit得到结果StackOverFlow,说明递归太深了。

    public class Solution extends GuessGame {
        public int guessNumber(int n) {
            return guessNumberInternal(1, n);
        }
        
        private int guessNumberInternal(int left, int right) {
            int middle = (left + right) / 2;
            int result = guess(middle);
            switch (result) {
                case 1:
                    return guessNumberInternal(middle + 1, right);
                case -1:
                    return guessNumberInternal(left, middle);
                default:
                    return middle;
            }
        }
    }
    

    循环代替递归

    那不能用递归做二分查找,能不能用循环来代替呢。
    下面的代码Submit后,报错Time Limit Exceeded。擦居然超时了。
    肉眼看代码检查了大半天,发现不粗破绽。

    public class Solution extends GuessGame {
        public int guessNumber(int n) {
            int left = 1;
            int right = n;
            int guessNumber = 1;
            while (left <= right) {
                int middle = (left + right) / 2;
                int result = guess(middle);
                boolean find = false;
                switch (result) {
                    case 1:
                        left = middle + 1;
                        break;
                    case -1:
                        right = middle - 1;
                        break;
                    default:
                        guessNumber = middle;
                        find = true;
                        break;
                }
                if (find) {
                    break;
                }
            }
            return guessNumber;
        }
    }
    

    超时原因,int做加法时溢出了

    在Java环境下,运行了上面的代码,才发现在计算middle时候,left + right这步计算int溢出了。
    最后,修改代码如下,Submit,终于Accepted了。

    public class Solution extends GuessGame {
        public int guessNumber(int n) {
            int left = 1;
            int right = n;
            int guessNumber = 1;
            while (left <= right) {
                int middle = left + (right - left) / 2;
                int result = guess(middle);
                boolean find = false;
                switch (result) {
                    case 1:
                        left = middle + 1;
                        break;
                    case -1:
                        right = middle - 1;
                        break;
                    default:
                        guessNumber = middle;
                        find = true;
                        break;
                }
                if (find) {
                    break;
                }
            }
            return guessNumber;
        }
    }
    
  • 相关阅读:
    seata原理
    activemq 启动时出现错误 Address already in use: JVM_Bind
    高并发第五弹:安全发布对象及单例模式
    高并发第三弹:线程安全原子性
    高并发第一弹:准备阶段 了解高并发
    CentOS7安装PostgreSQL9.4
    高并发第二弹:并发概念及内存模型(JMM)
    高并发第四弹:线程安全性可见性有序性
    设计模式模板方法模式
    设计模式建造者模式(图解,使用场景)
  • 原文地址:https://www.cnblogs.com/wingyip/p/5730894.html
Copyright © 2011-2022 走看看