为什么int mid = left + (right-left) / 2;比int mid = (left + right) / 2;运行的更快?

来源:8-1 二分算法简介

weixin_慕仙2234401

2021-12-26

老师,请问作业leetcode第278题
为什么int mid = left + (right-left) / 2;比int mid = (left + right) / 2;运行的更快?

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        int left = 0, right = n;
        while(left < right) {
            // 这里为什么写成int mid = (left + right) / 2就会超时?
            int mid = left + (right-left) / 2;
            if(isBadVersion(mid)) right = mid;
            else left = mid+1;
        }
        return left;
    }
}
写回答

1回答

javaman

2021-12-26

同学您好。

因为left + right可能会超过int范围。 可以改成把left和right改成long。但是mid还是要int。或者中间暂时用long计算。


正确代码如下:

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        int left = 0, right = n;
        while(left < right) {
            int mid = (int) ((((long) left) + right) / 2);
            if(isBadVersion(mid)) right = mid;
            else left = mid+1;
        }
        return (int) left;
    }
}


1
0

算法面试刷题课--竞赛命题人带你刷70+中高级题型

只需20小时, Google面试官带你完成Java算法面试准备

539 学习 · 65 问题

查看课程