二分函数
vector<int>a target
auto l=lower_bound(a.begin(),a.end(),target); //找到第一个值大于等于target的迭代器 找不到返回a.end()
auto r=upper_bound(a.begin(),a.end(),target); //找到第一个值大于target的迭代器 找不到返回a.end()
if(l!=ha.end())
int idx=l-a.begin(); //获取下标位置
二分模板
//寻找左边界
vector<int> nums target
int l = 0, r = nums.size()-1;
while(l < r)
{
mid = (l + r ) >> 1;
if (nums[mid] >= target) r = mid;
else l = mid + 1;
}
return l;
//寻找右边界(常用!)
vector<int> nums target
int l = 0, r = nums.size()-1;
while(l < r)
{
mid = (l + r + 1) >> 1;
if (nums[mid] <= target) l = mid;
else r = mid - 1;
}
return l;
74. 搜索二维矩阵 (两次二分or整体二分)
通过比较分割数组,两个区间必有一个有序
33. 搜索旋转排序数组 (用到了两次二分)
153. 寻找旋转排序数组中的最小值
利用峰顶特性进行分割(往高处走
162. 寻找峰值
852. 山脉数组的峰顶索引