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) 时间内不使用任何集合/多集合来做到这一点。