使用 c 编程进行二分搜索
Posted
技术标签:
【中文标题】使用 c 编程进行二分搜索【英文标题】:Binary search using c programming 【发布时间】:2021-11-30 06:34:21 【问题描述】:给定一个按升序排序的整数数组和一个整数目标,编写一个函数在数组中搜索目标。如果目标存在,则返回其索引。否则,返回 -1。
您必须编写一个运行时复杂度为 O(log n) 的算法。
我使用以下代码解决了上述问题:
int search(int* nums, int numsSize, int target)
int l = 0;
int r = numsSize -1;
int result = -1;
while(l <= r)
int mid = (l + (r-l))/2;
if(nums[mid] == target)
return result = nums[mid];
if(nums[mid] < target)
return l = mid + 1;
else
return r = mid - 1;
return result;
但我仍然没有得到正确的答案。请帮忙。
【问题讨论】:
在什么情况下你会得到错误的答案?您正在搜索的数组是什么?目标值是多少?你期待什么结果,你得到什么结果? 如果数组中只有 1 个元素 (l == r
),即使该元素与目标匹配,您也会自动返回 -1
。
@500-InternalServerError 返回的值应该是mid
,正如下面 Corina 的回答中所指出的那样。
【参考方案1】:
您正在返回新计算的 l
和 r
值。
if(nums[mid] < target)
return l = mid + 1;
else
return r = mid - 1;
您只需要更新它们并继续搜索元素。
if(nums[mid] < target)
l = mid + 1;
else
r = mid - 1;
【讨论】:
进行这些更改后,我的结果是 TIME LIMIT EXCEEDED【参考方案2】:更正的代码:
int search(int* nums, int numsSize, int target)
int l = 0;
int r = numsSize -1;
int result = -1;
printf("%d %d %d\n", numsSize, target, nums[0]);
while(l <= r)
int mid = l + (r - l) / 2;
if(nums[mid] == target)
return result = mid;
if(nums[mid] < target)
l = mid + 1;
else
r = mid - 1;
return result;
错误:
你计算错了中间值,不是:
int mid = (l + (r-l))/2;
正确的版本是:
int mid = l + (r - l) / 2;
-
您不应在此处使用 return,因为您会中断循环。
if(nums[mid] < target)
return l = mid + 1;
else
return r = mid - 1;
if(nums[mid] == target)
return result = nums[mid];
这里应该返回中间值,即目标值的位置,而不是值本身。
【讨论】:
你不需要return result = mid;
中的赋值(简称return mid;
),然后你可以完全消除result
并以return -1;
结尾。以上是关于使用 c 编程进行二分搜索的主要内容,如果未能解决你的问题,请参考以下文章