C++で最大の個別要素を持つサブシーケンスの数
整数のみを含む配列arr[]が与えられます。目標は、arr []のサブシーケンスの数を見つけて、それらが最大数の個別の要素を持つようにすることです。配列が[4,1,2,3,4]の場合、2つのサブシーケンスは[4,1,2,3]と[1,2,3,4]になります。
例を挙げて理解しましょう
入力 − arr [] ={1,3,5,4,2,3,1}
出力 −最大の個別要素を持つサブシーケンスの数は− 4
説明 −最大の個別要素は1、2、3、4、および5です。カウントは5です。サブシーケンスは-
になります。[1,3,5,4,2]、[3,5,4,2,1]、[5,4,2,3,1]、[1,5,4,2,3]。
入力 − arr [] ={5,4,2,1,3}
出力 −最大の個別要素を持つサブシーケンスの数は− 1
説明 −すべての要素が異なります。サブシーケンスの数は1になります。
以下のプログラムで使用されているアプローチは次のとおりです
このアプローチでは、すべての要素が異なる場合、サブシーケンスの数は配列自体である1であるという事実に基づいて、サブシーケンスを見つけます。繰り返される要素がある場合、繰り返される各要素は新しいサブシーケンスの一部になります。したがって、個別の要素の頻度のunorderdered_mapを作成します。次に、周波数ごとにその周波数を掛けてカウントします。最後に、カウントには頻度の総数があります。
-
整数配列arr[]を入力として受け取ります。
-
関数Max_distinct_subseq(int arr []、int size)は、配列とそのサイズを取得し、最大の個別要素を持つサブシーケンスの数を返します。
-
すべての要素が別個であるかのように、初期カウントを1とすると、配列自体は最大の別個の要素を持つサブシーケンスになります。
-
unordered_map
ハッシュを作成します。すべての異なる要素の頻度を保存します。 -
forループを使用して配列をトラバースし、hash [arr[i]]]++を使用して各要素arr[i]の頻度を更新します。
-
次に、forループを使用してハッシュをトラバースします。各周波数について、it-> second(it =iterator)は前のカウントに乗算します。同時にx個の要素がx個の異なるサブシーケンスの一部になるため。
-
最後に、カウントには頻度の総数があります。
-
結果としてカウントを返します。
例
#include <bits/stdc++.h> using namespace std; int Max_distinct_subseq(int arr[], int size){ int count = 1; unordered_map<int, int> hash; for (int i = 0; i < size; i++){ hash[arr[i]]++; } for (auto it = hash.begin(); it != hash.end(); it++){ count = count * (it->second); } return count; } int main(){ int arr[] = { 3, 7, 3, 3, 1, 5, 6, 9 }; int size = sizeof(arr) / sizeof(arr[0]); cout<<"Count of subsequences having maximum distinct elements are: "<<Max_distinct_subseq(arr, size); return 0; }
出力
上記のコードを実行すると、次の出力が生成されます-
Count of subsequences having maximum distinct elements are: 3
-
最初の山で最大の干し草の俵を数えるC++コード
n個の要素と別の値dを持つ配列Aがあるとします。農民は会社にn個の干し草を配置しました。 i番目の山にはA[i]干し草の俵が含まれています。毎日、牛は任意の山の干し草ベールを隣接する山に移動することを選択できます。牛は、それ以外の場合は何もしない日にこれを行うことができます。牛は、d日で最初の山の干し草の俵を最大化したいと考えています。最初の山の干し草の俵の最大数を数える必要があります。 したがって、入力がd=5のような場合。 A =[1、0、3、2]の場合、出力は3になります。これは、最初の日は3日から2日に移動し、2日目には再び3日から2日に移動し、次の2日は2日から1日を通過するためで
-
最大ベンド数のC++パス長
二分木が与えられる問題を解決するため。次に、曲がりの数が最大のパスを見つける必要があります。つまり、パスの方向が左から右に、またはその逆に変化する場合、たとえば、曲がりが考慮されます 入力- 出力- 6 このアプローチでは、ツリーをトラバースして、以前の動きを追跡します。方向が変わった場合は、曲げカウントを更新するだけで、最大値が見つかります。 解決策を見つけるためのアプローチ このアプローチでは、すべてのパスをトラバースし、回答を更新するベンドの最大数を見つけます。 例 #include <bits/stdc++.h> using namespace std; s