之前二分法取中值的时候,用的是mid = (left+right)/2
发现当left=1,right=2126753390时,超过INT_MAX,会变为复数
改为mid = left + (left + right)/2
一、完全匹配,查找和目标值完全相等的数
int find(vector<int>& nums, int target) {
int left = 0, right = nums.size();
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else right = mid;
}
return 0;
}
二、查找第一个不小于目标值的数,或查找最后一个小于目标值的数
int find(vector<int>& nums, int target) {
int left = 0, right = nums.size();
while (left < right) {
int mid = (right + left) / 2;
if (nums[mid] < target) left = mid + 1;
else right = mid;
}
return right;
}
三、查找第一个大于目标值的数,可变形为查找最后一个不大于目标值的数
int find(vector<int>& nums, int target) {
int left = 0, right = nums.size();
while (left < right) {
int mid = (right + left) / 2;
if (nums[mid] <= target) left = mid + 1;
else right = mid;
}
return right;
}
四、二分查找STL:lower_bound( )和upper_bound( )
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。
在从小到大的排序数组中,
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。