Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ผลคูณสูงสุดของดัชนีถัดไปทางซ้ายและขวาใน C++


ในบทช่วยสอนนี้ เราจะพูดถึงโปรแกรมเพื่อค้นหาผลคูณสูงสุดของดัชนีถัดไปที่มากกว่าทางซ้ายและขวา

สำหรับสิ่งนี้เราจะได้รับอาร์เรย์ของจำนวนเต็ม หน้าที่ของเราคือค้นหาองค์ประกอบที่มีผลิตภัณฑ์ Left-Right สูงสุด (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