C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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

  1. C++の以前のより大きな要素

    この問題では、配列が与えられます。私たちのタスクは、配列内の現在の要素の前にある最大の要素を返すことです。それ以外の場合は-1を出力します。 問題を理解するために例を見てみましょう Input: {6, 2, 7, 1, 5, 3} Output: -1, 6, -1, 7, 7, 7 この問題を解決するための簡単で明白な解決策は、配列の前の部分のより大きな要素をチェックするネストされたループを使用することです。 ソリューションの実装を示すプログラム 例 #include <iostream> using namespace std; void preceddingGreat

  2. 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