返回首页 C++ 模板

二分模板

在有序区间上快速查找——O(log n) 的搜索利器

二分查找 折半查找 GESP5
#include <bits/stdc++.h>
using namespace std;

// 二分查找:找 >= target 的最小值
int lowerBound(int a[], int n, int target) {
    int lo = 0, hi = n;
    while (lo < hi) {
        int mid = lo + (hi - lo) / 2;
        if (a[mid] < target) lo = mid + 1;
        else hi = mid;
    }
    return lo;
}

// 二分查找:找 > target 的最小值
int upperBound(int a[], int n, int target) {
    int lo = 0, hi = n;
    while (lo < hi) {
        int mid = lo + (hi - lo) / 2;
        if (a[mid] <= target) lo = mid + 1;
        else hi = mid;
    }
    return lo;
}

// 二分答案模板
bool check(int mid) { return true; /* 判断mid是否满足条件 */ }
int binaryAnswer(int lo, int hi) {
    while (lo < hi) {
        int mid = lo + (hi - lo) / 2;
        if (check(mid)) hi = mid;
        else lo = mid + 1;
    }
    return lo;
}

int main() {
    int a[] = {1, 3, 3, 5, 7, 9};
    cout << lowerBound(a, 6, 3) << endl;  // 1
    cout << upperBound(a, 6, 3) << endl;  // 3
    return 0;
}

📖 要点说明

⚠️ 常见错误