第8课:二分查找

潘CSP200班

2024-07-10 13:59:49
2024-08-09 21:20:17

信息与公告

1、知识点

(1)算法思想:利用数据的有序性,通过二分排除,实现快速查找,时间复杂度O(logn)
(2)适用条件:升序或降序序列
(3)二分查找函数:lower_bound()、upper_bound()(假设数组a的长度为n)
(4)从k个数中选出2个数的组合有 k*(k-1)/2 种 

2、例题:#11578. 数组元素的目标和

//思路:对a数组中每个元素a[i],在b数组中二分查找x-a[i]。
int a[100001];
int b[100001];
int main() {
    int n, m, x;
    cin>>n>>m>>x;
    for (int i = 0; i < n; i++) cin>>a[i];
    for (int i = 0; i < m; i++) cin>>b[i];
    for (int i = 0; i < n; i++) {   // 对每个a[i]
        int y = x - a[i];   
        int z = lower_bound(b + 0, b + m, y) - b;   // 在b中二分查找x-a[i]
        if (z < m && b[z] == y) {   // 找到x-a[i]
            cout<<i<<" "<<z;   
            return 0;
        }
    }
}