欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-20 11:59:10
...

题目地址: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\n", 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\n");
            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\n", num);
            }
        }
    }
 
    return 0;
}

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