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;
        }
    }
    
  • 相关阅读:
    代理模式
    建造者模式
    开源版本 hadoop-2.7.5 + apache-hive-2.1.1 + spark-2.3.0-bin-hadoop2.7整合使用
    Phoenix映射HBase数据表
    使用sqoop将mysql中表导入hive中报错
    数据库索引原理及优化(转载)
    6.JAVA知识点归纳整理
    5.hbase表新增数据同步之add_peer
    mongodb分布式集群搭建
    4.HBASE数据迁移方案(之snapshot):
  • 原文地址:https://www.cnblogs.com/wingyip/p/5730894.html
Copyright © 2011-2022 走看看