您的位置:首页 > 其它

二分搜索的区间问题

2015-02-05 00:07 148 查看
初始值决定了开闭。

跳转要维持开闭。

数组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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: