下面这个二分有什么问题吗?
int find(int x) {
int l = 0, r = new_Array.size();
while (l < r) {
int mid = l + r+1>> 1;
if (new_Array[mid]<=x )
l = mid ;
else
r = mid - 1;
}
//返回答案+1,应为后续的前缀和下标从1开始
return l + 1;
}
int l = 0, r = new_Array.size(); l到r 是数组长度+1 0~size()
最后为啥要L+1??
这个是题目 AcWing 802 里面的,题目特殊要求。这里就忽略啦,看前面就行。用下面这个就行
int find(int x) {
int l = 0, r = new_Array.size();
while (l < r) {
int mid = l + r>> 1;
if (new_Array[mid]>=x )
r = mid ;
else
l = mid + 1;
}
//返回答案+1,应为后续的前缀和下标从1开始
return l + 1;
}
我在这个题目讨论区也发了求助,大佬可以看一下吗,谢谢!
不要+1 -1 硬凑答案 不然你过了不知道为啥过,错了不知道为啥错
1 不管怎么样 size()长的数组 你的LR间隔是size+1 ,极端情况下肯定会越界的
2 你需要自行理解二分的两个模版
二分的两个模版 : 1 在单调递增序列a中查找>=x的数中最小的一个(即x或x的后继)
2 在单调递增序列a中查找<=x的数中最大一个(即x或者x的前驱)
感谢!!解决了