int binary_find(vector<int> &a, int target) //查找等于目标的数的位置
{
int left = 0; int right = a.size();
while (left<right)
{
int mid = left + (right - left) / 2;
if (a[mid]<target)
{
left = mid + 1;
}
else if (a[mid] >target)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int binary_find1(vector<int> &a, int target) //查找第一个不小于目标的数的位置,作用同STL中的lower_bound
{
int left = 0; int right = a.size();
while (left < right)
{
int mid = left + (right - left) / 2;
if (a[mid]<target)
{
left = mid + 1;
}
else
{
right = mid;
}
}
return right;
}
int binary_find2(vector<int>&a, int target) //查找第一个大于目标的数的位置,作用同STL中的upper_bound
{
int left = 0; int right = a.size();
while (left < right)
{
int mid = left + (right - left) / 2;
if (a[mid] <= target)
{
left = mid + 1;
}
else
{
right = mid;
}
}
return right;
}
leetcode 34. Search for a Range(O(logn))
寻找目标值所在的范围,用两次二分查找,第一次找第一个不小于目标值的数,第二次找大于目标值得第一个数。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ans(2,-1);
if(nums.size()<1) return ans;
int right = nums.size();
int left = 0;
while(left<right)
{
int mid = (left+right)/2;
if(nums[mid]<target) left=mid+1;
else right=mid;
}
if(nums[right]!=target||right>=nums.size()) return ans;
ans[0] = right;
right = nums.size();
while(left<right)
{
int mid = (left+right)/2;
if(nums[mid]<=target) left = mid+1;
else right = mid;
}
ans[1]=left-1;
return ans;
}
};