C++の次のGreaterElementII
循環配列があるとすると(最後の要素の次の要素は配列の最初の要素です)、すべての要素の次の大きい数値を表示する必要があります。ここで、数値xの次の大きい数は、配列内の次のトラバース順序の最初の大きい数です。これは、循環して次の大きい数を見つけることができることを意味します。存在しない場合は-1になります。したがって、数値が[1、2、1、3、2、1]の場合、出力は[2,3,3、-1,3,2]
になります。これを解決するには、次の手順に従います-
- n:=配列のサイズ
- サイズnのresと呼ばれる1つの配列を定義し、これを-1で埋めて、1つのスタックstを定義します
- 0〜2nの範囲のiの場合
- index:=i mod n、x:=nums [index]
- stが空ではなく、nums[スタックの最上位]
- res [スタックのトップ]:=x
- スタックから一番上の要素を削除します
- スタックにインデックスを挿入
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector <int> res(n, - 1);
stack <int> st;
for(int i = 0; i < 2 * n; i++){
int idx = i % n;
int x = nums[idx];
while(!st.empty() && nums[st.top()] < x){
res[st.top()] = x;
st.pop();
}
st.push(idx);
}
return res;
}
};
main(){
Solution ob;
vector<int> v = {1,2,1,3,2,1};
print_vector(ob.nextGreaterElements(v));
} 入力
[1,2,1,3,2,1]
出力
[2,3,3,-1,3,2]
-
C++の最小ヒープの最大要素
問題の説明 最小のヒープが与えられた場合、その中で最大の要素を見つけます。 例 入力ヒープが-の場合 その場合、最大要素は55です。 アルゴリズム 最小ヒープでは、親ノードはその子よりも少なくなります。したがって、非リーフノードを最大にすることはできないと結論付けることができます。 リーフノードで最大要素を検索 例 例を見てみましょう- #include <bits/stdc++.h> using namespace std; int getMaxElement(int *heap, int n) { int maxVal = heap[
-
C++の配列内のすべての要素に最も近い大きい値を検索します
ここでは、配列内のすべての要素に最も近い大きい値を見つける方法を説明します。要素xに、それよりも大きい次の要素があり、配列にも存在する場合、それはその要素のより大きな値になります。要素が存在しない場合は、-1を返します。配列要素が[10、5、11、6、20、12]であるとすると、大きい方の要素は[11、6、12、10、-1、20]になります。 20は配列内でそれ以上の値を持たないため、-1を出力します。 これを解決するために、C++STLのセットを使用します。セットは、バイナリツリーアプローチを使用して実装されます。二分木では、常に順序の後続が次に大きい要素です。したがって、O(log n)