返回信息流给定有序数组nums
给定范围(A,B),[A, B), [A, B], (A, B]
返回范围内的数组 subNums
在有重复数字的情况下,二分搜索不能命中重复数字的第一个,很烦
有没有优雅的lgn做法,除了构建segment tree
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #93694同步于 2017/6/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
有序数组查找范围怎么做比较合适
ml3615556
2017/6/29镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
“这还不简单,找到一个命中的,然后往左扫,找到相等的第一个”--我大一的时候就是这么想的,也是这么做的
【 在 ml3615556 的大作中提到: 】
: 给定有序数组nums
:
: 给定范围(A,B),[A, B), [A, B], (A, B]
:
: 返回范围内的数组 subNums
:
: 在有重复数字的情况下,二分搜索不能命中重复数字的
: .........
发自「贵邮」
...退化成o(n)了
【 在 caesar11 的大作中提到: 】
: “这还不简单,找到一个命中的,然后往左扫,找到相等的第一个”--我大一的时候就是这么想的,也是这么做的
:
: 发自「贵邮」
数字重复还是有影响的,普通的二分搜索并不能保证一定能命中哪个值。
这个是容器提供的方法吧,我就想知道它怎么做到的
难道加个0.5上去搜?
【 在 hxidkd 的大作中提到: 】
: 数字重复对二分不影响吧。std:: lower_bound也是用的二分返回第一个大于等于的数啊。
可以参考这里的实现
http://en.cppreference.com/w/cpp/algorithm/lower_bound
【 在 ml3615556 的大作中提到: 】
: 数字重复还是有影响的,普通的二分搜索并不能保证一定能命中哪个值。
: 这个是容器提供的方法吧,我就想知道它怎么做到的
: 难道加个0.5上去搜?
: ...................
是的,所以你问出这个问题,表明你没真正理解二分查找,跟我当时的状态是类似的。去看看lower_bound和upper_bound的实现吧。
【 在 ml3615556 的大作中提到: 】
: ...退化成o(n)了
:
: 【 在 caesar11 的大作中提到: 】
: : “这还不简单,找到一个命中的,然后往左扫,找到相等的第一个”--我大一的时候就是这么想的,也是这么做的
: :
: .........
发自「贵邮」
这个实现非常好
唉,可惜Java里面没有这样的实现,它的二分一旦命中目标就返回了
```java
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
```
【 在 hxidkd 的大作中提到: 】
: 可以参考这里的实现
: http://en.cppreference.com/w/cpp/algorithm/lower_bound