第五章 ALDS1_4_B Binary Search 二分搜索
来源:互联网 发布:mac 查看安装的程序 编辑:程序博客网 时间:2024/06/05 20:03
知识点
对于已经排序好的数列,我们可以使用二分搜索法更快速找到key。
初始:left = 0 , right = n,先通过key和位置mid = (left + right) / 2的元素比较,若key < A[mid] ,则设置right = mid;若key > A[mid],则设置left =mid +1;不断缩小范围重复上面的步骤直到key或者结束搜索。
问题链接
ALDS1_4_B Binary Search
问题内容
对于已经排序好的数列S,搜索包含q个不重复元素的T数列元素出现的总和。
思路
利用二分搜索的思想去做即可
代码
实现二分搜索
#include<iostream>#include<cstdio>using namespace std;// 二分搜索bool BinarySearch(int A[], int n, int key) { int left = 0 , right = n, mid; while (left < right) { mid = (left + right) / 2; if (key == A[mid]) return true; if(key > A[mid]) left = mid + 1; if (key < A[mid]) right = mid; } return false;}int main() { int n, q, key; int sum = 0; int A[100000 + 10]; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &A[i]); scanf("%d", &q); for (int i = 0; i < q; i++) { scanf("%d", &key); if (BinarySearch(A, n, key)) sum++; } printf("%d\n", sum);}
利用STL的binary_search
lower_bound(A, A+n,key):指向数列A中第一个不小于key的元素
upper_bound(A, A+n,key):指向数列A中第一个大于key的元素
binary_search(A,A+n,key):指向数列A中第一个不小于key的元素
binary_search内部实现运用了lower_bound
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int main() { int n, q, key; int sum = 0; int A[100000 + 10]; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &A[i]); scanf("%d", &q); for (int i = 0; i < q; i++) { scanf("%d", &key); if (binary_search(A, A + n, key)) sum++; } printf("%d\n", sum);}
阅读全文