奇思妙想录 我们读书越多,就越发现我们是无知的。——雪莱
博主

6月17日在线

奇思妙想录
临着一切不平常的急难,仅有勇敢和坚强才能拯救。——沙甫慈伯利
歌曲封面 未知作品

萌ICP备20248808号

津ICP备2023004371号-2

网站已运行 3 年 0 天 12 小时 17 分

Powered by Typecho & Sunny

2 online · 31 ms

Title

二分查找为什么不能使用(left+right)/2?

IhaveBB

·

技术分享

·

Article
⚠️ 本文最后更新于2023年11月15日,已经过了607天没有更新,若内容或图片失效,请留言反馈
AI摘要:在解决二分查找问题时,使用 (left+right)/2 计算中值可能会导致整数溢出,因为 Java 中的 int 类型是 32 位的。正确的方法是使用 left + (right - left)/2,这样可以避免溢出问题。在解决力扣上的二分查找问题时,应采用这种方法来计算中值,以确保算法在超出时间限制的情况下仍能正确运行。

Powered by AISummary.

刚刚在刷力扣时,刷到了一个简单地二分查找问题。
但当我提交时发现,超出了时间限制。
经过检查发现是中值出现了问题,mid = (left+right)/2;


若使用(left+right)/2,因为java中int数据类型是32位的,数值超过32位就会被反转。eg:2147483647+1 = -2147483648。
所以,我们不应使用此方法。而是应该使用left + (right - left)/2 <= right
因为根据定义得left < right
所以,right - left > 0且 <= right。并且left + (right - left) = right
因此,left + (right - left)/2 <= right;

♾️ java 代码:
    /** 
 * Forward declaration of guess API.
 * @param  num   your guess
 * @return          -1 if num is higher than the picked number
 *                  1 if num is lower than the picked number
 *               otherwise return 0
 * int guess(int num);
 */

//二分查找
public class Solution extends GuessGame {
    public int guessNumber(int n) {
        int left = 1;
        int right = n;
        while(left <= right){
            int mid = left + (right - left)/2 <= right;
            //int mid = (left+right)/2;
            int result = guess(mid);
            if(result == 0){
                return mid;
            }
            else if(result == -1){
                right = mid - 1;
            }
            else if(result == 1){
                left = mid + 1;
            }
        }
        return -1;
    }
}
现在已有 292 次阅读,0 条评论,0 人点赞
Author:IhaveBB
作者
二分查找为什么不能使用(left+right)/2?
当前文章累计共 1228 字,阅读大概需要 1 分钟。
JavaEE线程安全问题
2023年9月11日 · 0评论
国家海洋博物馆之旅
2023年7月20日 · 0评论
打造个性GitHub项目:Shields.io徽章制作
2024年7月22日 · 0评论
Comment:共0条
发表
搜 索 消 息 足 迹
你还不曾留言过..
你还不曾留下足迹..
博主

哈喽大家好呀

不再显示
博主