C++で最大要素がkより大きいサブ配列の数
整数要素と変数kを含む配列arr[]が与えられます。目標は、kを超える最大/最大要素を持つarr[]のサブ配列の数を見つけることです。配列が[1,2,3]で、kが1の場合、可能なサブ配列は[1]、[2]、[3]、[1,2]、[2,3]、[1,2,3]です。 ]。最大要素が1より大きいサブ配列は、[2]、[3]、[1,2]、[2,3]、[1,2,3]です。したがって、カウントは5です。
例を挙げて理解しましょう
入力 − arr [] ={1,2,5,3} k =3
出力 −最大要素がkより大きいサブアレイの数は− 6
説明 −可能なすべてのサブ配列は、[1]、[2]、[5]、[3]、[1,2]、[2,5]、[5,3]、[1,2,5]、[2、 5,3]、[1,2,5,3]。最大要素が3より大きいこれらの配列のうち、5が含まれている配列があります。それらは-
[5]、[2,5]、[5,3]、[1,2,5]、[2,5,3]、[1,2,5,3]。
合計6つのサブアレイ。
入力 − arr [] ={1,2,3,4,5} k =4
出力 −最大要素がkより大きいサブアレイの数は− 5
説明 −4より大きい要素のみが5です。5を含むサブ配列は-
になります。[5]、[4,5]、[3,4,5]、[2,3,4,5]、[1,2,3,4,5]。
合計5つのサブアレイ。
以下のプログラムで使用されているアプローチは次のとおりです
このアプローチでは、n個の要素を持つ配列のサブ配列の総数はn *(n + 1)/2であることがわかります。
ここで、要素がk未満のサブ配列を探します。このために、要素> kをスキップし、すべての要素がk未満のサブ配列の長さをカウントします。長さlごとに、各サブアレイはl *(l + 1)/2サブアレイを作成できます。このようなサブアレイごとにこの値を加算してXとします。最後に、この値Xをn *(n + 1)/ 2から減算して、目的の結果を取得します。
-
整数配列arr[]と変数kを入力として受け取ります。
-
関数maximum_k(int arr []、int size、int k)は、配列、k、および配列の長さを取り、最大要素がkより大きいサブ配列の数を返します
-
初期カウントを0とします。
-
whileループを使用して、配列をインデックスi=0からi
までトラバースします。 -
各要素について、arr [i]> kの場合は、continueステートメントを使用してスキップします。
-
それ以外の場合は、内側のwhileループを使用してサブアレイの長さのカウントを開始します。
-
arr[i]
-
現在のサブアレイの長さをtempとして保持している間、内部の終わりに。
temp *(temp + 1)/ 2を計算し、カウントに追加します。
-
そのようなすべてのサブアレイに対してこれを行います。
-
アウターの終わりに。要素が
のすべてのサブ配列の数として変数countがあります。 -
arr []のすべての可能なサブ配列の数、つまりsize *(size-1)/ 2からこの数を引くことにより、数を更新します。
-
結果としてカウントを返します。
例
#include <bits/stdc++.h> using namespace std; int maximum_k(int arr[], int size, int k){ int count = 0; int i = 0; while (i < size){ if (arr[i] > k){ i++; continue; } int temp = 0; while (i < size && arr[i] <= k){ i++; temp++; } int temp_2 = temp * (temp + 1); count = count + temp_2 / 2; } count = (size * (size + 1) / 2 - count); return count; } int main(){ int arr[] = { 4, 1, 2, 7, 8, 3 }; int k = 5; int size = sizeof(arr) / sizeof(arr[0]); cout<<"Count of subarrays whose maximum element is greater than k are: "<<maximum_k(arr, size, k); return 0; }
出力
上記のコードを実行すると、次の出力が生成されます-
Count of subarrays whose maximum element is greater than k are: 14
-
C++の以前のより大きな要素
この問題では、配列が与えられます。私たちのタスクは、配列内の現在の要素の前にある最大の要素を返すことです。それ以外の場合は-1を出力します。 問題を理解するために例を見てみましょう Input: {6, 2, 7, 1, 5, 3} Output: -1, 6, -1, 7, 7, 7 この問題を解決するための簡単で明白な解決策は、配列の前の部分のより大きな要素をチェックするネストされたループを使用することです。 ソリューションの実装を示すプログラム 例 #include <iostream> using namespace std; void preceddingGreat
-
C++で頻度がn/2以上のソートされた配列内の要素を検索します。
サイズnの配列があると考えてください。この配列はソートされています。頻度がn/2以上の要素が1つあります。ここで、nは配列内の要素の数です。したがって、配列が[3、4、5、5、5]の場合、出力は5になります。 これらのタイプの配列を注意深く観察すると、頻度がn/2以上の数がインデックスn/2にも存在することが簡単にわかります。したがって、要素は位置n / 2にあります。 例 Source Code: #include<iostream> using namespace std; int higherFreq(int arr[], int n) { ret