九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找

题目地址:http://ac.jobdu.com/problem.php?pid=1349

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

每个测试案例包括两行:

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



#include <stdio.h>
 
typedef struct timesofdata{
    int data;
    int times;
}TimesOfData;
 
int Bsearch (TimesOfData hash[], int start, int end, int k){
    int mid;
 
    while (start <= end){
        mid = (start + end) / 2;
        if (hash[mid].data < k)
            start = mid + 1;
        else if (hash[mid].data > k)
            end = mid - 1;
        else
            return hash[mid].times;
    }
    return 0;
}
 
int main(void){
    int n;
    int input;
    TimesOfData hash[1000000];
    int m;
    int k;
    int i;
    int j;
    int pre;
    int flag;
 
    while (scanf ("%d", &n) != EOF){
        for (i=0, j=-1; i<n; ++i){
            scanf ("%d", &input);
            if (i == 0 || input != pre){
                ++j;
                hash[j].data = input;
                hash[j].times = 1;
                pre = input;
            }
            else{
                ++hash[j].times;
            }
        }
        scanf ("%d", &m);
        while (m-- != 0){
            scanf ("%d", &k);
            printf ("%d
", Bsearch (hash, 0, j, k));
        }
    }
 
    return 0;
}

#include <stdio.h>
 
int Bsearch (int data[], int start, int end, int k){
    int mid;
 
    while (start <= end){
        mid = (start + end) / 2;
        if (data[mid] < k)
            start = mid + 1;
        else if (data[mid] > k)
            end = mid - 1;
        else
            return mid;
    }
    return -1;
}
 
int main(void){
    int n;
    int input[1000000];
    int m;
    int k;
    int i;
    int index;
    int num;
 
    while (scanf ("%d", &n) != EOF){
        for (i=0; i<n; ++i){
            scanf ("%d", &input[i]);
        }
        scanf ("%d", &m);
        while (m-- != 0){
            scanf ("%d", &k);
            index = Bsearch (input, 0, n-1, k);
            if (index == -1)
                printf ("0
");
            else{
                num = 1;
                i = index - 1;
                while (i >= 0 && input[i--] == k)
                    ++num;
                i = index + 1;
                while (i < n && input[i++] == k)
                    ++num;
                printf ("%d
", num);
            }
        }
    }
 
    return 0;
}

本以为主要考的是哈希表才有了第一个程序,谁知却是考的二分查找,呵呵……

原文地址:https://www.cnblogs.com/liushaobo/p/4373802.html