- 题目描述:
- 统计一个数字在排序数组中出现的次数。
- 输入:
-
每个测试案例包括两行:
第一行有1个整数n,表示数组的大小。1<=n <= 10^6。
第二行有n个整数,表示数组元素,每个元素均为int。
第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。
下面有m行,每行有一个整数k,表示要查询的数。
- 输出:
-
对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。
样例输入:
8 1 2 3 3 3 3 4 5 1 3
样例输出:
4【解题思路】本题很容易想到用map和set数据结构来完成。但map的构建和最后对map的查询需要的时间代价很大,但空间和时间应该是不允许的。综合查询操作和数组的有序的特点,我们采用二分查找来确定元素是否在数组里面。若在数组里面,则将其周围的元素的个数统计完成后输出。
AC code:
#include <cstdio> #include <vector> using namespace std; int main() { int n,m,tt; while(scanf("%d",&n)!=EOF) { vector<int> arr(n); for(int i=0;i<n;++i) scanf("%d",&arr[i]); scanf("%d",&m); for(int i=0;i<m;++i) { scanf("%d",&tt); int a=0,b=n-1,mid,cnt=0; bool flg=false; while(a<=b) { mid=((a+b)>>1); if(arr[mid]==tt){flg=true;break;} if(arr[mid]>tt)b=mid-1; if(arr[mid]<tt)a=mid+1; } if(flg) { int idx=mid; while(idx<n &&arr[idx++]==tt)++cnt; idx=mid; while(idx>0 && arr[--idx]==tt)++cnt; printf("%d ",cnt); }else printf("0 "); } } return 0; } /************************************************************** Problem: 1349 User: huo_yao Language: C++ Result: Accepted Time:740 ms Memory:4960 kb ****************************************************************/题目链接:http://ac.jobdu.com/problem.php?pid=1349九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299