区间分治类的题目,用左闭右闭就好,左闭右开不方便。(二叉树)
另外需要注意的是,求中点不要用 int mid = (l + r)/2,有溢出风险,稳妥的方法是 int mid = l + (r-l)/2;
如果你把除2改成右移1位:int mid=1+((r-1))>>1(右移的运算符优先级低,加括号), 更专业。
【如果 l 为 20亿,r 也是 20亿+1,相加会变负数(溢出)。如果使用 l+(r-l)/2 就没有这样的风险。】
(int占32位的时候,最大可以赋值为:2147483647。也就是0x7fffffff。注意:7的二进制形式最高位为0,如果你对2147483647+1.输出的就是-2147483648。这个数是负数中最大的数,也就是int型可以表示的最小的负数。它的十六进制表示为:0x8fffffff,8的二进制形式最高位是符号位,是1,为负。)
左闭右闭:
if (r < l) return NULL;//等号不能取
左闭右开:
if(l>=r)//等号必须取到,只取等号也可以
int mid=(l+r)/2;
//区间为[l,mid],[mid+1,r]
左开右闭:
if(l==r)//类似
int mid=(r+l+1)/2;//左开向上取整
//区间为[l,mid-1],[mid,r]
整理来源:leetcode