在主题二分搜索下的 InterviewBit 问题中,在 C++ 中的旋转排序数组中搜索超过了时间限制
Posted
技术标签:
【中文标题】在主题二分搜索下的 InterviewBit 问题中,在 C++ 中的旋转排序数组中搜索超过了时间限制【英文标题】:Time Limit Exceeded for search in rotated sorted array in C++ in InterviewBit problem under topic Binary Search 【发布时间】:2020-04-13 18:33:51 【问题描述】:问题是在 C++ 中搜索已排序、旋转数组中的元素。 我使用的方法是找到枢轴元素索引/最小元素索引,然后从 a[pivot......end] 或 a[beg,....pivot] 使用二进制找到键搜索。
找到最小元素索引的时间复杂度是 O(log n),然后找到元素也是 O(log n),因此总体时间复杂度将是 O(log n)
但我收到超过时间限制错误 这是我的代码:
int find_pivot(std::vector<int> a, int beg, int end)
while(beg<=end)
int mid=(beg+end)/2;
if(mid>0 && a[mid]<a[mid-1])
return mid;
else if(a[mid]>a[end])
beg=mid+1;
else
end=mid;
int search_element(std::vector<int> a, int key, int beg, int end)
int pivot = find_pivot(a,0,a.size()-1);
if(key>=a[pivot] && key<=a[end])
beg=pivot;
else
end=pivot;
while(beg<=end)
int mid=(beg+end)/2;
if(key==a[mid])
return mid;
else if(key>a[mid])
beg=mid+1;
else
end=mid-1;
return -1;
int Solution::search(const vector<int> &A, int B)
int n = A.size();
int i = search_element(A, B, 0, n-1);
if (i != -1)
return i;
else
return -1;
【问题讨论】:
if (i != -1) return i; else return -1;
是return i;
的更复杂的版本
注意!但我认为这不会影响时间复杂度。
SO 最近被这些在线测验问题所淹没。如果有的话,这个问题属于CodeReview。
没关系。它只是让阅读更轻松、更快捷。
但我超过了时间限制——这可能意味着你进入了一个无限循环。测试数据在哪里?如果您声称这是进行二进制搜索,那么不应该存在时间限制问题。即使有十亿个元素,你也必须探测不超过 31 次。因此我看到的唯一结论是你的代码有问题。
【参考方案1】:
检查您的 find_pivot 函数,假设数组通常按 [1,2,3,4,5] 排序。 现在,当您调用 find_pivot 函数时,将会出现 beg=0 和 end =1 的时间。
现在,由于 mid=(beg+end/2)=0,您的函数将更改 end=mid,这意味着 end 也变为 0。
现在你的 beg=0 和 end=0,现在当循环再次开始时 Mid = 0+0/2 并且这将继续重复。
进行一些更改,我认为问题在于数组何时正常排序或 end=begin。
【讨论】:
是的,当输入已排序但未旋转时,程序会陷入死循环。我没有添加输入时不旋转的条件(因为问题清楚地表明输入已排序和旋转)。以上是关于在主题二分搜索下的 InterviewBit 问题中,在 C++ 中的旋转排序数组中搜索超过了时间限制的主要内容,如果未能解决你的问题,请参考以下文章