在LeetCode上刷一道二分的简单题,需要计算m和n的中位数。
通常的想法是直接如下即可:
int mid = (m + n) / 2;
然而mid
存在溢出的风险,一种简单的解决办法是把mid
的类型改成 long long
,如下
long long mid = (m + n) / 2;
但是改成long long
就没意思了,如何优雅一点呢?我首先想了另一个办法,既然是相加再除以2,那除以2后再相加不就好了,即如下
int mid = m / 2 + n / 2;
这种办法看似正确,然而是存在问题的。即C++中除法固有的取整操作,设想m=5,n=1,那么按先相加再除以2的方法,得到的结果是3,而如果用先分别除以2再相加的方法,得到的结果却是2,即当m和n均为奇数时,就会出现问题。当然完全可以再判断m和n是否均为奇数然后再考虑加1,不过还有一种更简单的方法。
如下所示,假设m为较小值。
int mid = m + (n - m) / 2;