二分搜索无处不在,但是写好一个二分搜索却还需要躲避一些陷阱。
第一篇二分搜索论文在1946年就发表了,但是第一个没有错误的二分搜索程序却直到1962年才出现。

问题:给定一个有序数组,包含【1...n】,以及一个目标值。搜索目标值并返回。

int guessNumber(int n, int target){
    int left = 1, right = n, m = 0;
    while (left <= right)
    {
        m = left + (right - left)/2;
        if (m == target)
         return m;
        if(m > target)
            right = m ;
        else
            left = m ;
    }
    return m;
}

程序看起来非常简单,且对于绝大多数数据都能执行正确。
但是,如果输入是 2,2
数组内容为;[1,2],搜索 2.
left = 1 right = 2 。 m = 1
此时会陷入死循环。

正确程序:

int guessNumber(int n, int target){
    int left = 1, right = n, m = 0;
    while (left <= right)
    {
        m = left + (right - left)/2;
        if (m == target)
         return m;
        if(m > target)
            right = m - 1;
        else
            left = m + 1;
    }
    return m;
}

举例 1.......m........n
如果m < target 说明target在后半部分,则新的区间应为[m+1,n],而非[m,n].
同理,如果m > target, 说明target在前半部分,新区间应为:[1,m-1],而非[1,m].


fat_tiger
7 声望0 粉丝