マグニチュードポール:左側の要素がそれ以下であり、右側の要素がそれ以上である配列内の要素。
入力例
3,1,4,5,9,7,6,11
希望する出力
4,5,11
インタビューでこの質問をされたので、要素のインデックスを返し、条件を満たした最初の要素のみを返す必要があります。
私の論理
- 2つのMultiSet(重複も考慮できるように)を取ります。1つは要素の右側用で、もう1つは要素(極)の左側用です。
- 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)時間でセット/マルチセットを使用せずにこれを行う方法。