【发布时间】:2024-04-25 23:10:01
【问题描述】:
我正在尝试在已旋转的排序数组中找到最小元素。
例子:
1 2 3 4 5 => sorted
3 4 5 1 2 => Rotated => Find the min in this in O(log n)
我已经试着写代码了:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int bs(vector<int> a)
{
int l =0, r = a.size()-1;
while(l<=r)
{
int mid = l + (r-l)/2; // Mid guaranteed to be in range
if(a[mid-1]>a[mid]) return a[mid];
if(a[mid]>a[l])
{
l=mid+1 ; continue;
}
else
{
r = mid-1 ; //Mid has been checked
}
}
}
int main()
{
vector<int> a = {1,2,3,5,6,7,8,9,10};
rotate(a.begin(),a.begin()+4,a.end()); // Make 6 the head
for(auto x:a) cout<<x<<endl;
cout <<"Min is " <<bs(a) <<endl;
return 0;
}
我得到了输出:
6
7
8
9
10
1
2
3
5
Min is 3
,这显然是错误的。我想我正在操纵二进制搜索条件以适应我的问题,但我不知道出了什么问题。
我的方法类似于this,我认为我做的逻辑上是正确的,这当然是错误的想法。
【问题讨论】:
-
你为什么不添加一些打印输出来告诉你你的代码在做什么?
-
running your code 产生“最小值为 3”
-
@AmiTavory 我把输出放了。
-
我建议您在调试器中逐行逐行查看代码。
-
我真的不明白你在问什么。它是一个排序的旋转数组。你知道轮回吗?如果是这样,您知道 min 元素的索引。如果不是,为什么你认为它可以在 log 时间内解决?
标签: c++ algorithm vector stl binary-search