九度oj 题目1349:数字在排序数组中出现的次数

题目描述:
统计一个数字在排序数组中出现的次数。
输入:

每个测试案例包括两行:

第一行有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

使用库函数即可解决
 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 int n, m ,k;
 6 int num[1000002];
 7
 8 int main(int argc, char const *argv[])
 9 {
10     while(scanf("%d",&n) != EOF) {
11         for(int i = 0; i < n; i++) {
12             scanf("%d",&num[i]);
13         }
14         scanf("%d",&m);
15         while(m--) {
16             scanf("%d",&k);
17             int ans = upper_bound(num, num+n, k) - lower_bound(num, num+n, k);
18             printf("%d\n",ans);
19         }
20     }
21     return 0;
22 }

本来考虑这样做会快一些,可是并没有

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 int n, m ,k;
 6 int num[1000002];
 7
 8 int main(int argc, char const *argv[])
 9 {
10     while(scanf("%d",&n) != EOF) {
11         for(int i = 0; i < n; i++) {
12             scanf("%d",&num[i]);
13         }
14         scanf("%d",&m);
15         while(m--) {
16             scanf("%d",&k);
17             int low = lower_bound(num, num+n, k)-num;
18             int ans = 0;
19             for(int i = low; i < n && (num[i] == k); i++) {
20                 ans++;
21             }
22             printf("%d\n",ans);
23         }
24     }
25     return 0;
26 }

时间: 2024-12-26 16:38:54

九度oj 题目1349:数字在排序数组中出现的次数的相关文章

九度 1349 数字在排序数组中出现的次数

package com.wangzhu.njupt; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.StreamTokenizer; /** * 在已排序的数组中查找数出现的次数 * * @ClassName: Main1349 * @Description: TODO * @author 王竹 * @date 2014-

九度oj 1349 数字在排序数组中出现的次数

原题链接:http://ac.jobdu.com/problem.php?pid=1349 二分.. 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstdio> 5 using std::lower_bound; 6 using std::upper_bound; 7 const int Max_N = 1000010; 8 int arr[Max_N];

【剑指offer】题目38 数字在排序数组中出现的次数

思路: 应该是用二分查找分别找到该数字第一次和最后一次出现的位置,相减即可.O(logn) int findLeft(int a[], int n, int num) { int l = 0, r = n - 1; while(l <= r) { int m = l + (r - l) / 2; if(a[m] == num) //与普通二分查找的区别在等于这里 { if(m == 0 || a[m - 1] != num) //如果这是第一个数字或者它前面的数字不是num那么这个位置就是第一个

九度_题目1349:数字在排序数组中出现的次数

//用map来实现总是超出最大的内存限制 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有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

剑指offer面试题38:数字在排序数组中出现的次数

题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 下面有m行,每行有一个整数k,表示要查询的数. 输出: 对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数. 样例输入: 81 2 3 3 3 3 4 513 样例输出: 4 //source:http

【剑指offer】数字在排序数组中出现的次数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27364557 题目描写叙述: 统计一个数字在排序数组中出现的次数. 输入: 每一个測试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每一个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 以下有m行,每行有一个整数k,表示要查询的数. 输出: 相应每一个測试案例,有m行输出,

剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)

题目: 统计一个数字在排序数组中出现的次数. 思路: 因为是排好序的数组,所以可以采用二分查找的算法. 一般最容易想到的思路是采用二分查找先找到一个,然后往他左右两边遍历,但是这个方法由于在n个数组中还可能有n个k,所以 查找的复杂度还是O(n) 可以先用二分查找算法找到第一个出现的位置,即当找到一个时,看它前面一个是否也是k或者是否已经是查找这段的第一个了 然后同样用二分查找找最后一个出现的位置. 1 #include<iostream> 2 #include<vector> 3

(剑指Offer)面试题38:数字在排序数组中出现的次数

题目: 统计一个数字在排序数组中出现的次数. 思路: 1.顺序遍历 顺序扫描一遍数组,统计该数字出现的次数. 时间复杂度:O(n) 2.二分查找 假设我们需要找的数字是k,那么就需要找到数组中的第一个k和最后一个k出现的位置. 如何通过二分查找得到第一个k的位置呢? 取数组中间的数字与k作比较, 如果该数字比k大,那么k只能出现在前半部分,那么下一轮只能在前半部分找: 如果该数字比k小,那么k只能出现在后半部分,那么下一轮只能在后半部分找: 如果该数字等于k,需要判断这是不是第一个k,如果该数字

剑指offer:数字在排序数组中出现的次数

题目描述: 统计一个数字在排序数组中出现的次数. 思路分析: 1. 直观思路是直接遍历一遍,统计.复杂度也只要O(n). 2. 显然这道题要考察的内容不这么简单,实际上考虑二分的思想来完成.分别二分查找第一个k和最后一个k.具体来说,利用二分查找思想,找到k,再判断当前的前一个是否为k或是否为第一个元素,若是,则返回:否则即第一个k在前面,则右边界r左移,继续递归查找.对于最后一个k的查找思路类似. 代码: 思路二: 1 class Solution { 2 public: 3 int GetF