0
点赞
收藏
分享

微信扫一扫

leetcode278——第一个错误的版本-总结

_鱼与渔_ 2022-01-20 阅读 82

今日在学习二分查找,在leetcode上练习,发现有时候会出现

Line 11: Char 28: runtime error: signed integer overflow: 1063376696 + 2126753390 cannot be represented in type 'int' (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:22:28

其实内存可能出现泄漏,那问题在哪?

class Solution {
public:
    int firstBadVersion(int n) {
        int first = 1;
        int end = n;
        int mid;
        while(first<end){
            mid =first+(end-first)/2;  
            //mid = ((first^end)>>1)+(first & end);
            if(isBadVersion(mid)) end = mid;
            else first = mid+1;
        }
        return first;
    }
};

查阅了一些资料后,发现原来是由于mid =first+(end-first)/2; 该语句。

在一般情况下,当然没有什么问题(在许多人的解答中也是这么写的),但因为int 的范围-2^31 - 2^31-1,显然可能出现溢出的情况。

故我们用mid = ((first^end)>>1)+(first & end);代替它。

开始我也没看明白,为什么mid = ((first^end)>>1)+(first & end);可以等同于mid=(first+end)/2;呢?

直到找到了一个解答,我觉得有点意思。

故(a+b)/2=((a^b)>>1+(a&b))

总结:

建议在竞赛中尽量用这种方式((a^b)>>1+(a&b)),而非mid=(first+end)/2。这样避免内存泄漏的情况

举报

相关推荐

0 条评论