C++の左右の次に大きいインデックスの最大積
このチュートリアルでは、左右で次に大きいインデックスの最大積を見つけるプログラムについて説明します。
このために、整数の配列が提供されます。私たちのタスクは、最大の左右積(L(i)* R(i)を持つ要素を見つけることです。ここで、L(i)は左側の最も近いインデックスであり、現在の要素よりも大きく、R(i)は右側の最も近いインデックスです。現在の要素よりも大きい)。
例
#include <bits/stdc++.h>
using namespace std;
#define MAX 1000
//finding greater element on left side
vector<int> nextGreaterInLeft(int a[], int n) {
vector<int> left_index(MAX, 0);
stack<int> s;
for (int i = n - 1; i >= 0; i--) {
while (!s.empty() && a[i] > a[s.top() - 1]) {
int r = s.top();
s.pop();
left_index[r - 1] = i + 1;
}
s.push(i + 1);
}
return left_index;
}
//finding greater element on right side
vector<int> nextGreaterInRight(int a[], int n) {
vector<int> right_index(MAX, 0);
stack<int> s;
for (int i = 0; i < n; ++i) {
while (!s.empty() && a[i] > a[s.top() - 1]) {
int r = s.top();
s.pop();
right_index[r - 1] = i + 1;
}
s.push(i + 1);
}
return right_index;
}
//finding maximum LR product
int LRProduct(int arr[], int n) {
vector<int> left = nextGreaterInLeft(arr, n);
vector<int> right = nextGreaterInRight(arr, n);
int ans = -1;
for (int i = 1; i <= n; i++) {
ans = max(ans, left[i] * right[i]);
}
return ans;
}
int main() {
int arr[] = { 5, 4, 3, 4, 5 };
int n = sizeof(arr) / sizeof(arr[1]);
cout << LRProduct(arr, n);
return 0;
} 出力
8
-
C++のツリー内の2つの交差しないパスの最大積
この問題では、n個のノードを持つ無向接続ツリーTが与えられます。私たちのタスクは、C++のツリー内の2つの交差しないパスの最大積を見つけるプログラムを作成することです。 問題の説明 −ツリー内の交差しない2つのパスの最大積を見つける。興味のないすべてのパスを見つけてから、それらの長さの積を見つけます。 問題を理解するために例を見てみましょう 入力 グラフ- 出力 8 説明 考慮される交差しないパスはC-A-B およびF-E-D-G-H 。 長さは2と4です。Product=8。 ソリューションアプローチ この問題の解決策は、DFSを使用してツリーをトラバースすることです。そ
-
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;