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

C++プログラムの左右の次のインデックスの最大積


この問題では、配列arr[]が与えられます。私たちのタスクは、左右の次に大きいインデックスの最大積を計算するプログラムを作成することです。

問題の説明

与えられた配列について、left [i] *right[i]の最大値の積を見つける必要があります。両方の配列は-

として定義されます
 left [i] =j、arr [i] <’のように。 ‘arr[j]およびi>j.right [i] =j、つまりarr [i] 

問題を理解するために例を見てみましょう

入力

 arr [6] ={5、2、3、1、8、6} 

出力

 15 

説明

左配列の作成、left [] ={0、1、1、3、0、5} right [] ={5、3、5、5、0、0}インデックス製品:1 −> 0 * 5 =02 −> 1 * 3 =33 −> 1 * 5 =54 −> 3 * 5 =155 −> 0 * 0 =06 −> 0 * 5 =0 

最大の製品

 15 

ソリューションアプローチ

要素の左右にある大きい要素のインデックスの最大積を見つけること。まず、左右のインデックスを大きくして、比較のためにそれらの製品を保存します。

ここで、左と右の最大の要素を見つけるために、左と右のインデックス値のより大きな要素を1つずつチェックします。見つけるために、スタックを使用します。そして、次の操作を行います

スタックが空の場合->現在のインデックスをプッシュ、tos=1。tosはスタックの最上位です。 

これを使用して、配列の左右の指定された要素よりも大きいすべての要素のインデックス値を見つけることができます。

ソリューションの動作を説明するプログラム

 #include usingnamespace std; int * findNextGreaterIndex(int a []、int n、char ch){int * greatIndex =new int [n]; stackインデックス; if(ch =='R'){for(int i =0; i  a [index.top()− 1] ){int indexVal =index.top(); index.pop(); greatIndex [indexVal − 1] =i + 1; } index.push(i + 1); }} else if(ch =='L'){for(int i =n − 1; i> =0; i-){while(!index.empty()&&a [i]>a[index。 top()− 1]){int indexVal =index.top(); index.pop(); greatIndex [indexVal − 1] =i + 1; } index.push(i + 1); }} return greatIndex;} int calcMaxGreaterIndedxProd(int arr []、int n){int * left =findNextGreaterIndex(arr、n、'L'); int * right =findNextGreaterIndex(arr、n、'R'); int maxProd =−1000; int prod; for(int i =1; i  maxProd)maxProd =prod; } return maxProd;} int main(){int arr [] ={5、2、3、1、8、6}; int n =sizeof(arr)/ sizeof(arr [1]); cout<<"左右の次に大きいインデックスの最大積は"< 

出力

左右の次に大きいインデックスの最大積は15です

  1. C++で最大の積と合計がNに等しいNの4つの要素を見つけます

    整数Nがあるとします。タスクは、Nのすべての因子を見つけ、-のようにNの4つの因子の積を表示することです。 それらの4つの要素の合計はNに等しい 4つの要素の積が最大です 数が24であるとすると、積は1296になります。すべての因子が1、2、3、4、6、8、12、24であることがわかっているので、因子6を4回選択する必要があります。したがって、6 + 6 + 6 + 6 =24です。ここでは、積が最大になります。 これを解決するには、1からNまでのすべての要素を見つけてから、これらの条件を確認する必要があります Nが素数の場合、答えは偽になります 与えられたnが

  2. C /C++の左シフトおよび右シフト演算子

    左シフト 左シフト演算子では、左オペランドの値は、右オペランドで指定されたビット数だけ左に移動します。 これはC言語の左シフト演算子の例です 例 #include <stdio.h> int main() {    int y = 28; // 11100    int i = 0;    for(i;i<=3;++i)    printf("Left shift by %d: %d\n", i, y<<i);    return 0;