跳转要维持开闭。
数组arr[0..n-1]
1.左闭右闭
int low = 0;
int high = n -1;
int mid = (low + high)/2;
则当 a[mid] > val > a[0]
因为函数a是单调递增的
则目标在[0,mid) 然后转换成左闭右闭--->[0,mid-1]
所以我们可以得到high = mid - 1;
则当a[mid] < val 时
目标在[mid+1,n-1] 然后可以得到low = mid + 1;
2.左开右闭
int low = -1;
int high = n - 1;
int mid = (low + high) / 2;
则当 a[mid] > val > a[0]
因为函数a是单调递增的
则目标在[0,mid) 然后转换成左开右闭--->(-1,mid-1]
所以我们可以得到high = mid - 1;
则当a[mid] < val 时
目标在[mid+1,n-1] 然后转换成左开右闭--->(mid,n-1]
可以得到low = mid ;
(low + high) / 2和low + (high - low)/2的区别
第一种可能会溢出
第二种不容易溢出
while()内的东西
如果是最简单的版本(全闭)
那么写的是high low
如果全开区间
那么low**high -> low*high*
也就是low + 1 == high