C++のサイズKのすべてのサブ配列の最大一意要素
この問題では、整数の配列と整数Kが与えられます。私たちのタスクは、サイズKのすべてのサブ配列で重複のない最大の一意の要素を見つけるプログラムを作成することです。
問題を理解するために例を見てみましょう
入力 −
array = {4, 1, 1, 3, 3} k = 3
出力 −
4 3 1
説明 −
Sub-array of size 3 Subarray {4, 1, 1}, max = 4 Subarray {1, 1, 3}, max = 3 Subarray {1, 3, 3}, max = 1のサブ配列
この問題を解決する簡単な方法の1つは、2つのループを実行してサブ配列を作成し、個別の要素を見つけて最大数を出力することです。
ただし、効果的な解決策は、スライディングウィンドウ方式を使用することです。 ハッシュテーブルと自己平衡BSTを使用して、最大の要素を見つけます。
したがって、配列をトラバースし、kの長さの要約について、要素の数をハッシュテーブルに格納し、要素をセットに格納します(一意の要素のみを格納します)。そして、セットの最大値を出力し、配列内のすべての反復に対して同じことを行います。
例
ソリューションの動作を説明するプログラム
#include <bits/stdc++.h> using namespace std; void maxUniqueSubArrayElement(int A[], int N, int K){ map<int, int> eleCount; for (int i = 0; i < K - 1; i++) eleCount[A[i]]++; set<int> uniqueMax; for (auto x : eleCount) if (x.second == 1) uniqueMax.insert(x.first); for (int i = K - 1; i < N; i++) { eleCount[A[i]]++; if (eleCount[A[i]] == 1) uniqueMax.insert(A[i]); else uniqueMax.erase(A[i]); if (uniqueMax.size() == 0) cout<<"-1\t" ; else cout<<*uniqueMax.rbegin()<<"\t"; int x = A[i - K + 1]; eleCount[x]--; if (eleCount[x] == 1) uniqueMax.insert(x); if (eleCount[x] == 0) uniqueMax.erase(x); } } int main(){ int a[] = { 4, 3, 2, 2, 3, 5}; int n = sizeof(a) / sizeof(a[0]); int k = 4; cout<<"The maximum unique element for a subarray of size "<<k<<" is\n"; maxUniqueSubArrayElement(a, n, k); return 0; }
出力
The maximum unique element for a subarray of size 4 is 4 -1 5
-
C++でのサイズがX以上Y以下のサブアレイの最大平均
問題の説明 配列arr[]と2つの整数XおよびYが与えられます。タスクは、平均が最大で、サイズがX以上Y以下のサブ配列を見つけることです。 例 入力配列が{2、10、15、7、8、4}で、x=3およびY=3の場合、次のように最大平均12.5を取得できます- (10 + 15) / 2 = 12.5 アルゴリズム XからサイズYまでのサイズのすべてのサブアレイを反復処理し、そのようなすべてのサブアレイの中で最大の平均を見つけます。 時間計算量を減らすために、プレフィックス合計配列を使用して、O(1)の複雑さのサブ配列の合計を取得できます 例 例を見てみましょう- #include &
-
C++の最小ヒープの最大要素
問題の説明 最小のヒープが与えられた場合、その中で最大の要素を見つけます。 例 入力ヒープが-の場合 その場合、最大要素は55です。 アルゴリズム 最小ヒープでは、親ノードはその子よりも少なくなります。したがって、非リーフノードを最大にすることはできないと結論付けることができます。 リーフノードで最大要素を検索 例 例を見てみましょう- #include <bits/stdc++.h> using namespace std; int getMaxElement(int *heap, int n) { int maxVal = heap[