LeetCode No.374 Guess Number Higher or Lower | #binary-tree

Q:

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!
Example: n = 10, I pick 6.Return 6.

A:

Binary search二分法检索时间复杂度O(log​2​​n)。(三分法worst case时间复杂度是O(log​3n))
先比较mid key,大了,往mid后面找,小了往前面找。
每次,没找到,重新设定边界值start和end。

public int guessNumber(int n) {
    int start = 1, end = n;

    while(start < end) {
        int mid = start + (end - start) / 2;   //备注

        if(guess(mid) == 0) {
            return mid;
        } 
        else if(guess(mid) == 1) {  //说明target比mid值要大
            start = mid + 1;        //起点设置为mid后一位
        } 
        else {                    //说明target比mid值要小
            end = mid;            //终点设置为mid
        }
    }
    return start;
}

备注:不能写成 mid = (start+end)/2,会integer overflow
比如测试用例 (2126753390,1702766719):
overflow一开始不会,2126753390+1并没有超过Integer最大值2147483647,但是寻找的这个target=1702766719,那么需要重新设定start值=mid值(106337670),这是再计算(mid+end)/2,加法得到319013009超过了Integer的最大值,导致overflow。如果mid+(end-mid)/2则不会。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,776评论 0 33
  • 思考:最初只是写了第三种,然后对与第一种后面的 if(j>Math.sqrt(i))System.out.prin...
    实在想不出昵称丶阅读 143评论 0 0
  • 硬要排的话,一命二运三贵人,四相五养六风水,七积阴德八读书,九取名字十敬神。积德之前全都不可控,积德保证有好的人际...
    徐州风清扬阅读 191评论 0 0
  • 亮度不知道要怎么打,有大神指教吗
    一只要上天的猪阅读 148评论 0 1
  • 2017年已经过了十一天了,这个时候才来写下过去一年的总结,好像确实晚了一点,不过这也给了我清醒思考与总结的时间。...
    乐见其成阅读 528评论 2 3