题目:
分析:
对二分进行控制,使用两次,使得一次得到的结果是左边界,另一次是右边界。
紫书相关部分截图:
下界的代码,即从左到右遍历,第一次出现的是x位置,
int lower_bound(int*A, int x, int y, int v)
{
int m;
while(x < y){
m = x+(y-x)/2;
if(A[m]>=v) y=m;
else x=m+1;
}
return x;
}
**分析:**如果目标不存在,直接判断A【x】的值就可以啦。
int lower_upper(int*A, int x, int y, int v)
{
int m;
while(x < y){
m = x+(y-x)/2;
if(A[m]<=v) x=m+1;
else y=m;
}
return x;
}
x不是最后最后一次出现的位置,x-1才是。
不存在还是判断a【x-1】。
代码:
class Solution {
public:
vector<int> searchRange(vector<int>& A, int v) {
int x=0,y=A.size();
vector<int> mm(2,-1);
if(A.size()==0||v<A[0]||v>A[A.size()-1]) return mm;
//右
int m;
while(x < y){
m = x+(y-x)/2;
if(A[m]<=v) x=m+1;
else y=m;
}
// cout<<x-1;
if(A[x-1]!=v) return mm;
mm[1]=x-1;
//左
x=0,y=A.size()-1;
while(x < y){
m = x+(y-x)/2;
if(A[m]>=v) y=m;
else x=m+1;
}
cout<<x;
mm[0]=x;
return mm;
}
};