intbinary_search(vector<int>& arr, int target){ int left = 0, right = arr.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; // 找到目标值,返回下标 } elseif (arr[mid] < target) { left = mid + 1; // 目标在右半部分 } else { right = mid - 1; // 目标在左半部分 } } return-1; // 没找到返回-1 }
二分查找的变体
1. 查找第一个大于等于目标值的位置(下界)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 查找第一个大于等于target的位置(下界) intlower_bound(vector<int>& arr, int target){ int left = 0, right = arr.size(); while (left < right) { int mid = left + (right - left) / 2; if (arr[mid] >= target) { right = mid; } else { left = mid + 1; } } return left; }
2. 查找最后一个小于等于目标值的位置(上界)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 查找第一个大于target的位置(上界) intupper_bound(vector<int>& arr, int target){ int left = 0, right = arr.size(); while (left < right) { int mid = left + (right - left) / 2; if (arr[mid] > target) { right = mid; } else { left = mid + 1; } } return left; }
// 普通二分查找 intbinary_search(vector<int>& arr, int target){ int left = 0, right = arr.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; // 找到目标值,返回下标 } elseif (arr[mid] < target) { left = mid + 1; // 目标在右半部分 } else { right = mid - 1; // 目标在左半部分 } } return-1; // 没找到返回-1 }
// 查找第一个大于等于target的位置(下界) intlower_bound(vector<int>& arr, int target){ int left = 0, right = arr.size(); while (left < right) { int mid = left + (right - left) / 2; if (arr[mid] >= target) { right = mid; } else { left = mid + 1; } } return left; }
// 查找第一个大于target的位置(上界) intupper_bound(vector<int>& arr, int target){ int left = 0, right = arr.size(); while (left < right) { int mid = left + (right - left) / 2; if (arr[mid] > target) { right = mid; } else { left = mid + 1; } } return left; }