0

我正在尝试解决二进制搜索的 Spoj 问题,但我不断得到“错误答案”并且我看不到我的问题。这是我的搜索功能:

int binarySearch(int numbers[], int size, int key)
{
    int start = 0;
    int end = size - 1;
    int middle;

    while(start <= end)
    {
        middle = start + (end - start)/2;

        if(key < numbers[middle])
            end = middle - 1;
        else if(key > numbers[middle])
            start = middle + 1;
        else
            return middle;
    }

    return -1;
}

这是我的主要功能

int main()
{
    int *numbers;
    int n_numbers, n_queries, key, i, found;

    scanf("%d %d", &n_numbers, &n_queries);
    numbers = (int*)malloc(n_numbers * sizeof(int));

    for(i = 0; i<n_numbers; i++)
        scanf("%d", &numbers[i]);

    for(i = 0; i<n_queries; i++)
    {
        scanf("%d", &key);
        found = binarySearch(numbers, n_numbers, key);
        printf("%d\n", found);
    }

    return 0;
}

这是 SPOJ 问题: http ://www.spoj.com/problems/BSEARCH1/

4

3 回答 3

2

问题是您需要返回第一次出现的位置(从零开始),并且在找到密钥后立即返回。

但数组可能是:0 1 1 1 1 1 1 1 1 1 1 1 2

关键是 1。您应该返回 1(第一次出现的位置),而不是返回 6。

于 2012-12-17T22:22:58.537 回答
1

你的算法是正确的。数据未排序,因此您的二进制搜索算法无法正确地将解决方案归零。

于 2012-12-17T22:03:36.753 回答
0

不完全清楚您正在使用哪种基于 C 的语言,但表达式 (end - start)/2 可能会返回一个浮点值,然后当您实际上希望该值四舍五入时将其截断为整数?

于 2012-12-17T22:06:41.787 回答