今日在学习二分查找,在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。这样避免内存泄漏的情况