LintCode-662. 猜数游戏(C++)

来源:互联网 发布:求一个windows live id 编辑:程序博客网 时间:2024/05/17 01:56

题目描述:

我们正在玩猜数游戏。 游戏如下:
我从 1 到 n 选择一个数字。 你需要猜我选择了哪个号码。
每次你猜错了,我会告诉你这个数字是高还是低。
你调用一个预定义的接口 guess(int num),它会返回 3 个可能的结果(-1,1或0):

原始代码:

// Forward declaration of guess API.// @param num, your guess// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0int guess(int num);class Solution {public:    /**     * @param n an integer     * @return the number you guess     */    int guessNumber(int n) {        // Write your code here    }};

分析:

这道题其实可以看成一个查找算法(查找那个你要猜的数)。在这里我用的折半查找(平均时间复杂度为O(log2n)

  • 第一次尝试:
// Forward declaration of guess API.// @param num, your guess// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0int guess(int num);class Solution {public:    /**     * @param n an integer     * @return the number you guess     */    int guessNumber(int n) {        // Write your code here        int low = 1, high = n;        while(low < high) {            int mid = (low + high) / 2;            int r = guess(mid);            if(r == 1) {                low = mid + 1;            } else if(r == -1) {                high = mid - 1;            } else {                return mid;            }        }    }};

运行之后显示错误Time Limit Exceeded,然后显示的测试数据是2147483647,而这个数就是int型数据能储存的最大的数。这是因为low + high会出现超出int型数据类型存储范围,导致超限的数字变成负数进而造成死循环。
这里写图片描述
所以做一下修改:

// Forward declaration of guess API.// @param num, your guess// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0int guess(int num);class Solution {public:    /**     * @param n an integer     * @return the number you guess     */    int guessNumber(int n) {        // Write your code here        int low = 1, high = n;        while (low < high) {            int mid = low + (high - low)/2; //这样就OK了!            int r = guess(mid);            if(r == 1) {                low = mid + 1;            } else if(r == -1) {                high = mid - 1;            } else {                return mid;            }        }    }};
原创粉丝点击