高效算法设计(二分查找,范围统计)
来源:互联网 发布:台湾观光局数据 编辑:程序博客网 时间:2024/06/02 02:56
二分查找
二分查找一般写成非递归形式,输入数组,使用sort函数将数组排序。
- 如果由多个相同的数,返回第一个数(lowerBound)。
- 如果不存在,返回下标i,使i和i以后的往右移动。
输入:
81 9 6 3 4 7 9 0381 9 6 3 4 7 9 05
输出:
24
#include <stdio.h>#include<algorithm>#define MAXSIZE 1024using namespace std;/*int binarySearch(int *A,int x,int y,int val){ while(x<y){//不能取等于,会陷入死循环 int m=x+(y-x)/2; if(A[m]<val){ x=m+1; } else if(A[m]>val){ y=m; } else { return m; } } return -1;//如果改成x,就是val所在的位置。}*/int lowerBound(int *A,int x,int y,int val){//下界 while(x<y){//这是一个迭代过程,只有当x>y时才退出。 int m=x+(y-x)/2; if(A[m]<val){ x=m+1; } else if(A[m]>val){ y=m; } else { return m; } } return x;}int upperBound(int *A,int x,int y,int val){//下界 while(x<y){//这是一个迭代过程,只有当x>y时才退出。 int m=x+(y-x)/2; if(A[m]<val){ x=m+1; } else if(A[m]>val){ y=m; } else { return m; } } return x;}int main(){ int n; while(scanf("%d",&n)!=EOF){ int A[MAXSIZE]; for(int i=0;i<n;i++){ scanf("%d",&A[i]); } sort(A,A+n); int val; scanf("%d",&val); printf("%d\n",upperBound(A,0,n,val)); } return 0;}
范围统计(上面的拓展)
题目:给出n个整数xi和m个询问,对于每个询问(a,b),输出闭区间[a,b]内的整数xi的个数。
输入:
8 30 1 3 4 6 7 9 93 90 10 9
输出:
662288
#include <cstdio>//#include <stdio.h>#include <algorithm>//STL算法的头文件,包含sort,lower_bound,upper_bound等using namespace std;int v[10000];int lowerBound(int *A,int x,int y,int val){ int m; while(x<y){ m=x+(y-x)/2; if(A[m]>=val) y=m; else x=m+1; } return x;}int upperBound(int *A,int x,int y,int val){ int m; while(x<y){ m=x+(y-x)/2; if(A[m]<=val) x=m+1; else y=m; } return x;}int main() { int n,m,a,b; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&v[i]); sort(v,v+n); for(int i=0;i<m;i++){ scanf("%d%d",&a,&b); printf("%d\n",upper_bound(v,v+n,b)-lower_bound(v,v+n,a)); printf("%d\n",upperBound(v,0,n,b)-lowerBound(v,0,n,a)); } return 0;}
阅读全文
0 0
- 高效算法设计(二分查找,范围统计)
- 高效算法设计(二分查找,范围统计)
- 算法竞赛入门经典:第八章 高效算法设计 8.8二分查找之范围统计
- 二分查找(范围统计)
- 针对范围对的高效查找算法设计(不准用数组)
- 查找算法(二分查找、顺序统计(中值))
- 算法竞赛入门经典:第八章 高效算法设计 8.5二分查找
- 算法竞赛入门经典:第八章 高效算法设计 8.6二分查找之lowerBound
- 算法竞赛入门经典:第八章 高效算法设计 8.7二分查找之upperBound
- 紫书_第八章_高效算法设计_8.2.3——二分查找
- 算法设计周记(九)--二分查找
- 二分查找算法(折半查找算法)
- 二分查找算法(折半查找算法)
- 折半查找算法(二分查找算法)
- 查找算法(2)--二分查找算法
- 算法设计与分析 二分查找
- 范围概率 用二分查找
- 利用STL二分查找范围
- 2017年8月12日训练日记
- 十进制转八进制(函数版)
- 利用pyinstaller将python脚本打包发布
- 代理模式(Proxy Pattern)
- 【南阳oj 108士兵杀敌(一)】 (线段树 模板题)
- 高效算法设计(二分查找,范围统计)
- 8月12日训练日记
- IO流学习-03
- 基础线段树·修改版
- 极验验证码破解(二)
- IOS逆向之汇编语言程序入门
- 2.常用控件:ListView
- ACM第三次比赛题目及标准程序(贪心)
- 《剑指offer》牛客网java题解-从尾到头打印链表