AcWing 33. 一道很好的二分题目
原题链接
中等
作者:
炽热小老弟
,
2025-03-13 21:04:12
·河北
,
所有人可见
,
阅读 2
太抽象了题目
class Solution {
public:
//这个题目不是整体有序 但是分2段各自有序(这个很细节了)
//也就是说 从左端点到一个最大值是一个有序段 最大值下一个到最后又是一个有序段位
//我们可以二分考虑这个问题 456 7 012 670 1 245
//我们首先二分 得到一个中间值(分两种情况1:中间值是左边有序段的2中间值是右边有序段的)
//这个和我们找目标值有什么关系 或者说下一步该分到那一部分呢?
//明确:我们的目标值可能就是中点 可能在左段 可能在右段
//如果我们目标值在左半边-----》中点也在左边那么就是找到了一个2分的左右段点了(回到正常二分上)
//如果我们的中点在右半段 那么我们可以让右段点r左移 那么区间就缩到2边了(虽然左边结构不清楚)
//右边就是对称的情况我
int search(vector<int>& a, int x) {
int l=0,r=a.size()-1;
int n=r;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]==x) return mid;
if(a[mid]>=a[0]) //看中点在左边
{
if(x>=a[0]&&x<a[mid]) //左边定死了
r=mid-1;
else //说明target在右边区间
l=mid+1;
}
else //670 1 245情况 x=4
{
if(x>a[mid]&&x<=a[n]) l=mid+1;
else r=mid-1;
}
}
if(a[l]!=x) return -1;
return l;
}
};