【九度】题目1349:数字在排序数组中出现的次数
2013-12-09 17:56
316 查看
题目1349:数字在排序数组中出现的次数
【解题思路】
数组的巧妙运用。
依然是值当做另外一个数组的下标。
这种应用只能是输入全部为正值的时候。
另外声明的时候,数组要开大一些。
其他没什么了。应用还蛮多。
Java使用二分查找去做的,因为数组是有序的。
Java也用了数组去做,发现不管是内存消耗还是时间消耗,二分查找都要相对快一些。
C++ AC
Java AC 数组运用
Java AC
时间限制:1 秒内存限制:32 兆特殊判题:否提交:1385解决:405 题目描述: 统计一个数字在排序数组中出现的次数。 输入: 每个测试案例包括两行: 第一行有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 答疑: 解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-8072-1-1.html
【解题思路】
数组的巧妙运用。
依然是值当做另外一个数组的下标。
这种应用只能是输入全部为正值的时候。
另外声明的时候,数组要开大一些。
其他没什么了。应用还蛮多。
Java使用二分查找去做的,因为数组是有序的。
Java也用了数组去做,发现不管是内存消耗还是时间消耗,二分查找都要相对快一些。
C++ AC
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int maxn = 1000002; int array[maxn]; int n,m,i; int main(){ while(scanf("%d",&n) != EOF){ int num; memset(array,0,sizeof(array)); for(i = 0; i < n; i++){ scanf("%d",&num); array[num]++; } scanf("%d",&m); for(i = 0; i < m; i++){ scanf("%d",&num); printf("%d\n",array[num]); } } return 0; } /************************************************************** Problem: 1349 User: wangzhenqing Language: C++ Result: Accepted Time:830 ms Memory:4928 kb ****************************************************************/
Java AC 数组运用
import java.io.StreamTokenizer; public class Main { /* * 1431 */ public static void main(String[] args) throws Exception { StreamTokenizer st = new StreamTokenizer(System.in); while (st.nextToken() != StreamTokenizer.TT_EOF) { int n = (int) st.nval; int numCountArr[] = new int[2000000]; int array[] = new int ; for (int i = 0; i < n; i++) { st.nextToken(); array[i] = (int) st.nval; numCountArr[array[i]]++; } st.nextToken(); int m = (int) st.nval; for (int i = 0; i < m; i++) { st.nextToken(); int queryNum = (int) st.nval; System.out.println(numCountArr[queryNum]); } } } } /************************************************************** Problem: 1349 User: wzqwsrf Language: Java Result: Accepted Time:2130 ms Memory:177104 kb ****************************************************************/
Java AC
import java.io.StreamTokenizer; public class Main { /* * 1349 * 这是一个已经排好序的序列。根据2分查找法,找到查询数字出现的开头和结尾。 * 结尾-开头+1即为个数。 */ public static void main(String[] args) throws Exception { StreamTokenizer st = new StreamTokenizer(System.in); while (st.nextToken() != StreamTokenizer.TT_EOF) { int n = (int) st.nval; int array[] = new int ; for (int i = 0; i < n; i++) { st.nextToken(); array[i] = (int) st.nval; } st.nextToken(); int m = (int) st.nval; for (int i = 0; i < m; i++) { st.nextToken(); int queryNum = (int) st.nval; int result = getNumCount(array ,queryNum); System.out.println(result); } } } private static int getNumCount(int[] array, int queryNum) { int begin = findNumBegin(array ,queryNum); int end = findNumEnd(array ,queryNum); if (begin > -1 && end > -1){ return (end - begin + 1); } return 0; } private static int findNumBegin(int[] array, int queryNum) { int low = 0; int high = array.length-1; while (low <= high) { int middle = (low + high ) / 2; if (array[middle] < queryNum) { low = middle + 1; }else if (array[middle] == queryNum) { if (middle == 0 || array[middle - 1] != queryNum) { return middle; }else { high = middle - 1; } }else { high = middle - 1; } } return -1; } private static int findNumEnd(int[] array, int queryNum) { int low = 0; int high = array.length - 1; while (low <= high) { int middle = (low + high ) / 2; if (array[middle] < queryNum) { low = middle + 1; }else if (array[middle] == queryNum) { if ( middle == high ||(middle < high && array[middle + 1] != queryNum) ){ return middle; }else { low = middle + 1; } }else { high = middle - 1; } } return -1; } } /************************************************************** Problem: 1349 User: wzqwsrf Language: Java Result: Accepted Time:1680 ms Memory:23852 kb ****************************************************************/
相关文章推荐
- [九度oj]题目1349:数字在排序数组中出现的次数
- 九度 题目1349:数字在排序数组中出现的次数
- 九度_题目1349:数字在排序数组中出现的次数
- 九度 题目1349:数字在排序数组中出现的次数
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
- [九度OnlineJudge][剑指Offer]题目1349:数字在排序数组中出现的次数
- 题目1349:数字在排序数组中出现的次数-九度
- 九度 1349 数字在排序数组中出现的次数
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
- 九度笔记之 1349:数字在排序数组中出现的次数
- 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)
- 九度OJ-题目1349:数字在排序数组中出现的次数
- 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)
- 剑指Offer - 九度1349 - 数字在排序数组中出现的次数
- 剑指offer题目——数字在排序数组中出现的次数
- 九度_题目1370:数组中出现次数超过一半的数字
- [九度oj]题目1370:数组中出现次数超过一半的数字
- 【剑指offer】题目38 数字在排序数组中出现的次数
- 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找
- 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找