我想解决二进制搜索的Spoj问题,但我一直得到“错误答案”,我看不出我的问题。 这是我的bsearch功能:
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/
答案 0 :(得分:2)
问题是您需要返回第一个出现位置(从零开始),并在找到密钥后立即返回。
但阵列有可能是: 0 1 1 1 1 1 1 1 1 1 1 1 2
关键是1.你应该返回1(第一次出现的位置),而你将返回6。
答案 1 :(得分:1)
您的算法是正确的。数据未排序,因此您的二进制搜索算法无法正确归零解决方案。
答案 2 :(得分:0)
不完全清楚你正在使用哪种基于C的语言但是表达式(end-start)/ 2可能会返回一个浮点值,然后当你真的想要将值舍入时将其截断为整数?