【发布时间】:2013-03-13 22:21:58
【问题描述】:
Magnitude Pole:数组中左侧元素小于或等于它且右侧元素大于或等于它的元素。
示例输入
3,1,4,5,9,7,6,11
期望的输出
4,5,11
我在面试中被问到这个问题,我必须返回元素的索引,并且只返回第一个满足条件的元素。
我的逻辑
- 取两个 MultiSet(这样我们也可以考虑重复),一个用于元素的右侧,一个用于元素的左侧 元素(极点)。
- 从第 0 个元素开始,将其余所有元素放在“正确的集合”中。
- 如果第 0 个元素小于或等于“右集”上的所有元素,则返回其索引。
- 否则将其放入“左集”并从索引 1 处的元素开始。
- 遍历数组,每次从“左集”中选择最大值,从“右集”中选择最小值并进行比较。
- 在任何时刻,对于任何元素,其左侧的所有值都在“左集合”中,而其右侧的值都在“右集合”中
代码
int magnitudePole (const vector<int> &A) {
multiset<int> left, right;
int left_max, right_min;
int size = A.size();
for (int i = 1; i < size; ++i)
right.insert(A[i]);
right_min = *(right.begin());
if(A[0] <= right_min)
return 0;
left.insert(A[0]);
for (int i = 1; i < size; ++i) {
right.erase(right.find(A[i]));
left_max = *(--left.end());
if (right.size() > 0)
right_min = *(right.begin());
if (A[i] > left_max && A[i] <= right_min)
return i;
else
left.insert(A[i]);
}
return -1;
}
我的问题
- 我被告知我的逻辑不正确,我无法理解为什么这个逻辑不正确(尽管我已经检查了一些案例和 它正在返回正确的索引)
- 出于我自己的好奇心,如何在 O(n) 时间内不使用任何 set/multiset 的情况下做到这一点。
【问题讨论】:
-
你对算法背后逻辑的描述似乎对细节有点不精确(你什么时候从 RHS 中删除?你什么时候比较?你什么时候插入 LHS?)但是在总的来说,这个想法似乎是正确的,因为它基本上是一种蛮力搜索,它使用多集来帮助记账。
-
其实是在线测试,所以我先写了代码,但是当他们回答说错了,我就告诉他们这是我做的。所以可能是我的算法不详细,但是他们根据代码中的算法来判断。
-
4 不是震级吗?
标签: algorithm