二分搜索的区间问题
2015-02-05 00:07
148 查看
初始值决定了开闭。
跳转要维持开闭。
数组arr[0..n-1]
1.左闭右闭
则当 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.左开右闭
则当 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
跳转要维持开闭。
数组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
相关文章推荐
- 二分搜索的基本相关问题
- 第2章 递归与分治策略,二分搜索技术(查找不成功时,返回区间位置)
- 用到二分搜索的抽签问题
- POJ - 2456/USACO - Feb05 Gold Aggressive cows 二分搜索+区间选点+贪心
- HDU 5289 Assignment [RMQ区间查询+二分搜索]
- 一个python的问题——二分搜索
- 问题 : 紧张的考试周【区间覆盖的时间优化】【二分】
- 搜索算法-二分搜索-方程解问题(problem 1001)
- 二分搜索问题(未理解)
- 整体二分初探 两类区间第K大问题 poj2104 & hdu5412
- 0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- 与二分搜索相关的几个问题
- 二分搜索/查找(最大化or最小化问题)
- 搜索算法-二分搜索-方程解问题(problem 1002)
- 【分治法】分治法与二分搜索,棋盘覆盖问题
- 二分搜索的基本相关问题
- 03算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- cf 484b 二分搜索/区间最值
- 【CF689D Friends and Subsequences】二分搜索,区间查询
- 0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题