C++でi
コンセプト
サイズnの正の整数の特定の配列に関して、トリプレット(a i )の最大合計を決定するタスク + a j + a k )0 <=i iのように j k 。
入力
a[] = 3 6 4 2 5 10
出力
19
説明
All possible triplets are:-
3 4 5 => sum = 12
3 6 10 => sum = 19
3 4 10 => sum = 17
4 5 10 => sum = 19
2 5 10 => sum = 17
Maximum sum = 19
メソッド
さて、シンプルなアプローチ 3つのネストされた「forループ」を持つすべてのトリプレットにアクセスし、すべてのトリプレットの合計を1つずつ更新することを決定します。ここで、このメソッドの時間計算量はO(n ^ 3)であり、「n」の値を高くするには不十分です。
繰り返しになりますが、より良いアプローチを適用できます 上記のアプローチでさらに最適化を行うため。この方法では、3つのネストされたループを持つすべてのトリプレットを訪問する代わりに、2つのネストされたループを訪問できます。
各番号を訪問するとき(中間要素(a j ))、最大数を決定します(a i ) j未満 その前にあり、最大数(ak)がa j より大きい それを超えて。最後に、a iの計算された合計で最大回答を更新します + a j + a k
例
// C++ program to find maximum triplet sum
#include <bits/stdc++.h>
using namespace std;
// Shows function to calculate maximum triplet sum
int maxTripletSum(int arr1[], int n1){
// Used to initialize the answer
int ans1 = 0;
for (int i = 1; i < n1 - 1; ++i) {
int max1 = 0, max2 = 0;
// Determine maximum value(less than arr1[i])
// from i+1 to n1-1
for (int j = 0; j < i; ++j)
if (arr1[j] < arr1[i])
max1 = max(max1, arr1[j]);
// Determine maximum value(greater than arr1[i])
// from i+1 to n1-1
for (int j = i + 1; j < n1; ++j)
if (arr1[j] > arr1[i])
max2 = max(max2, arr1[j]);
// store maximum answer
if(max1 && max2)
ans1=max(ans1,max1+arr1[i]+max2);
}
return ans1;
}
// Driver code
int main(){
int Arr[] = { 3, 6, 4, 2, 5, 10 };
int N = sizeof(Arr) / sizeof(Arr[0]);
cout << maxTripletSum(Arr, N);
return 0;
}
出力
19
-
C++でm以下の長さの最大合計配列を検索します
この問題では、長さの異なるn個の配列が与えられます。私たちのタスクは、m以下の長さの最大合計配列を見つけることです。 合計を最大化し、結合されたすべてのサブ配列の長さをmに等しくするには、配列からサブ配列を見つける必要があります。 問題を理解するために例を見てみましょう 入力 n = 3, m = 4
arrOfArr[][] = {
{5, 2, -1, 4, -3}
{3, -2, 1, 6}
{-2, 0, 5}
} 出力 20 説明 SubArrays are {5, 4}, {6}, {5},
len
-
C++のバイナリツリーで最大レベルの合計を見つける
この問題では、正と負の値を持つ二分木が与えられます。私たちのタスクは、バイナリツリーで最大レベルの合計を見つけることです。 問題の説明: 二分木があります。二分木のすべてのレベルの合計を見つけて、それらの最大値を返します。 問題を理解するために例を見てみましょう 入力: 出力: 5 説明: レベル1:3の要素の合計 レベル2の要素の合計:-3 + 4 =1 レベル3の要素の合計:5 --1 + 6-5 =5 ソリューションアプローチ この問題を解決するには、レベル順トラバーサルを使用してツリーをトラバースする必要があります。そして、レベルごとに、合計
コンセプト
サイズnの正の整数の特定の配列に関して、トリプレット(a i )の最大合計を決定するタスク + a j + a k )0 <=i
入力
a[] = 3 6 4 2 5 10
出力
19
説明
All possible triplets are:- 3 4 5 => sum = 12 3 6 10 => sum = 19 3 4 10 => sum = 17 4 5 10 => sum = 19 2 5 10 => sum = 17 Maximum sum = 19
メソッド
さて、シンプルなアプローチ 3つのネストされた「forループ」を持つすべてのトリプレットにアクセスし、すべてのトリプレットの合計を1つずつ更新することを決定します。ここで、このメソッドの時間計算量はO(n ^ 3)であり、「n」の値を高くするには不十分です。
繰り返しになりますが、より良いアプローチを適用できます 上記のアプローチでさらに最適化を行うため。この方法では、3つのネストされたループを持つすべてのトリプレットを訪問する代わりに、2つのネストされたループを訪問できます。
各番号を訪問するとき(中間要素(a j ))、最大数を決定します(a i ) j未満 その前にあり、最大数(ak)がa j より大きい それを超えて。最後に、a iの計算された合計で最大回答を更新します + a j + a k
例
// C++ program to find maximum triplet sum #include <bits/stdc++.h> using namespace std; // Shows function to calculate maximum triplet sum int maxTripletSum(int arr1[], int n1){ // Used to initialize the answer int ans1 = 0; for (int i = 1; i < n1 - 1; ++i) { int max1 = 0, max2 = 0; // Determine maximum value(less than arr1[i]) // from i+1 to n1-1 for (int j = 0; j < i; ++j) if (arr1[j] < arr1[i]) max1 = max(max1, arr1[j]); // Determine maximum value(greater than arr1[i]) // from i+1 to n1-1 for (int j = i + 1; j < n1; ++j) if (arr1[j] > arr1[i]) max2 = max(max2, arr1[j]); // store maximum answer if(max1 && max2) ans1=max(ans1,max1+arr1[i]+max2); } return ans1; } // Driver code int main(){ int Arr[] = { 3, 6, 4, 2, 5, 10 }; int N = sizeof(Arr) / sizeof(Arr[0]); cout << maxTripletSum(Arr, N); return 0; }
出力
19
-
C++でm以下の長さの最大合計配列を検索します
この問題では、長さの異なるn個の配列が与えられます。私たちのタスクは、m以下の長さの最大合計配列を見つけることです。 合計を最大化し、結合されたすべてのサブ配列の長さをmに等しくするには、配列からサブ配列を見つける必要があります。 問題を理解するために例を見てみましょう 入力 n = 3, m = 4 arrOfArr[][] = { {5, 2, -1, 4, -3} {3, -2, 1, 6} {-2, 0, 5} } 出力 20 説明 SubArrays are {5, 4}, {6}, {5}, len
-
C++のバイナリツリーで最大レベルの合計を見つける
この問題では、正と負の値を持つ二分木が与えられます。私たちのタスクは、バイナリツリーで最大レベルの合計を見つけることです。 問題の説明: 二分木があります。二分木のすべてのレベルの合計を見つけて、それらの最大値を返します。 問題を理解するために例を見てみましょう 入力: 出力: 5 説明: レベル1:3の要素の合計 レベル2の要素の合計:-3 + 4 =1 レベル3の要素の合計:5 --1 + 6-5 =5 ソリューションアプローチ この問題を解決するには、レベル順トラバーサルを使用してツリーをトラバースする必要があります。そして、レベルごとに、合計