c++ - 在主题二分搜索下的 InterviewBit 问题中,在 C++ 中旋转排序数组中的搜索超过了时间限制
问题描述
问题是在 C++ 中的已排序、旋转数组中搜索元素。我使用的方法是找到枢轴元素索引/最小元素索引,然后从 a[pivot......end] 或 a[beg,....pivot] 使用二进制找到键搜索。
找到最小元素索引的时间复杂度是 O(log n),然后找到元素也是 O(log n),因此总体时间复杂度将是 O(log n)
但是我收到了 Time Limit Exceeded 错误这是我的代码:
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;
}
解决方案
检查您的 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。
推荐阅读
- python - 如何从另一个 python 程序运行 pytest Suite
- html - 将 R 文件编译成 HTML:data.frame(x,y) 中的错误:找不到 p
- mysql - 如何为每个父母收集最多记录
- javascript - 用 array.map() 中的渲染数据反应 js 问题
- r - R - 按字符迭代地选择和重命名列
- html - 为什么此 html 页面的完整内容未显示
- python - Python timeit.timeit - 排序的片段版本比使用 lambda 运行得更快,为什么?
- go - 使用 JWT 的 GraphQL Golang 身份验证
- javascript - Next.js:react-color - 警告:道具`style`不匹配
- angular - 如何确保用户输入图像(FORM ANGULAR)