九度OJ-题目1349:数字在排序数组中出现的次数
来源:互联网 发布:广联达预算软件手机版 编辑:程序博客网 时间:2024/03/29 04:52
题目链接地址:
九度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) 通过二分查找找到待查元素k在数组中的位置;
(2) 以k在数组中的位置为中心,先向左查找与k相等的元素,再向右查找与k相等的元素。
(3) 待所有查找操作完成后,即可统计出数字k在数组中出现的次数。
举个栗子,对于测试用例1 2 3 3 3 3 4 5,下面是查找3的过程:
1) 通过二分查找可以得知’3’在数组中的下标是3(数组下标从0开始);
2) 以数组的第3个元素为中心,向左查找可以得知第2个元素也是’3’,再向右查找可以得知第4个和第5个元素也是’3’;
3) 最后可以得知数字’3’在该数组中出现的次数是4。
AC代码如下:
#include<stdio.h>#define MAX 1000001 int number[MAX]; /*** 输入整形数组* @param n 输入的数组大小* @return void*/void inputArray(int n){ int i; for(i = 0;i < n;i++) { scanf("%d",&number[i]); }} /*** 二分查找* @param k 待查找的元素* @param n 数组的长度* @return position 待查元素在数组中的位置,如果查找不成功,则返回-1*/int binarySearch(int k,int n){ int position = -1; int left = 0,right = n - 1; int middle; while(left <= right) { middle = (left + right) / 2; if(k == number[middle]) { position = middle; break; } else if(k > number[middle]) { left = middle + 1; } else { right = middle - 1; } } return position;} /*** 统计k在有序数组中出现的次数。以k为中心,向数组两边同时查找与k相等的元素* @param k 待查找的元素* @param position k在数组中的位置* @param n 数组的长度* @return count 数字k在有序数组中出现的次数*/int countKinSortArray(int k,int position,int n){ int count = 0; int i = position - 1; int j = position; // 向数组的左边查找与k相等的元素,为了避免查找过程中出现数组越界,先判断i是否大于等于0,再让number[i]与k进行比较 while(i >= 0 && number[i] == k) { i--; count++; } // 向数组的右边查找与k相等的元素 while(j < n && number[j] == k) { j++; count++; } return count;} int main(){ int n,m,k; int position; // 待查元素在有序数组中的位置 int count; // 待查元素在有序数组中出现的次数 while(EOF != scanf("%d",&n)) { inputArray(n); scanf("%d",&m); while(m--) { scanf("%d",&k); count = 0; position = binarySearch(k,n); if(-1 != position) { count = countKinSortArray(k,position,n); } printf("%d\n",count); } } return 0;} /************************************************************** Problem: 1349 User: blueshell Language: C++ Result: Accepted Time:730 ms Memory:4928 kb****************************************************************/
0 0
- [九度oj]题目1349:数字在排序数组中出现的次数
- 九度OJ-题目1349:数字在排序数组中出现的次数
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
- 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)
- 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找
- 九度oj 1349 数字在排序数组中出现的次数
- 题目1349:数字在排序数组中出现的次数-九度
- 【九度】题目1349:数字在排序数组中出现的次数
- 九度 题目1349:数字在排序数组中出现的次数
- 九度_题目1349:数字在排序数组中出现的次数
- [九度OnlineJudge][剑指Offer]题目1349:数字在排序数组中出现的次数
- 九度 题目1349:数字在排序数组中出现的次数
- [九度oj]题目1370:数组中出现次数超过一半的数字
- 九度OJ-题目1370:数组中出现次数超过一半的数字
- 九度笔记之 1349:数字在排序数组中出现的次数
- 算法题目---数字在排序数组中出现的次数
- 【剑指Offer面试编程题】题目1370:数组中出现次数超过一半的数字--九度OJ
- 九度OJ 1370 数组中出现次数超过一半的数字
- vc++ 各种类型转换
- C实现 LeetCode->Reverse Integer
- 查看Activity栈
- tableView 各个属性
- 垂直居中-父元素高度确定的多行文本(方法二)
- 九度OJ-题目1349:数字在排序数组中出现的次数
- 关于灰度矩阵的说明
- Redis学习手册(String数据类型)
- 实习期间被教导的事情
- 总结的面试中常见65种应聘技巧回答
- 数据结构系列之折半查找树
- NDK的APP_STL与APP_LDFLAGS
- 水平居中设置-行内元素
- POJ1328 Radar Installation