二分查找是一个基本的算法能能力,不仅包含查元素是否存在,还包含查多个元素存在的时候的上下限,这个和c++里面的 upper_bound 和 lower_bound 的功能一致,非常重要
总结来讲
- 查元素的位置
- 元素不存在的时候,在哪个位置插入
- 元素多个存在的时候,查元素存在的上下限
#include <iostream>
#include <vector>
using namespace std;
/*
写法1
*/
int lower1(const vector<int>& v, int target) {
int l = 0, r = v.size() - 1;
while (l <= r) {
int m = (r - l) / 2 + l;
if (v[m] >= target) {
r = m - 1;
} else {
l = m + 1;
}
}
return l;
}
int upper1(const vector<int>& v, int target) {
int l = 0, r = v.size() - 1;
while (l <= r) {
int m = (r - l) / 2 + l;
if (v[m] > target) {
r = m - 1;
} else {
l = m + 1;
}
}
return l - 1;
}
/*
写法2
*/
int lower(const vector<int>& v, int target) {
int l = 0, r = v.size();
while (l < r) {
int m = (r - l) / 2 + l;
if (v[m] >= target) {
r = m;
} else {
l = m + 1;
}
}
return l;
}
int upper(const vector<int>& v, int target) {
int l = 0, r = v.size();
while (l < r) {
int m = (r - l) / 2 + l;
if (v[m] > target) {
r = m;
} else {
l = m + 1;
}
}
return l - 1;
}
int main()
{
cout<<"Hello World";
vector<int> v{0, 1, 2, 3, 4, 5, 6};
int low = lower(v, 4);
int up = upper(v, 4);
cout << "low: " << low << ", up: " << up << endl;
int low1 = lower1(v, 4);
int up1 = upper1(v, 4);
cout << "low1: " << low1 << ", up1: " << up1 << endl;
return 0;
}
从 rotated sorted array中查找到最小的或者最大的元素,也可以用binary search,
int findMinInSortedAndRotatedArray(vector<int> nums) {
int l = 0, r = nums.size() - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (nums[mid] > nums[r]) l = mid + 1;
else r = mid;
}
return l;
}