对于一个有 N 个元素的数组,包含如下的元素 a1, a2, ..., an,我们定义了两个函数:
-
L(i) = j 需要满足的条件如下:
- j < i
- a[j] > a[i]
- 如果找不到 j 的话,那么 L(i) = 0;如果有多个 j 的话,选择离 i 最近的那一个
-
R(i) = k 需要满足的条件如下:
- k > i
- a[k] > a[i]
- 如果找不到 k 的话,那么 R(i) = 0;如果有多个 k 的话,选择离 i 最近的那一个
最后,我们定义 MAX(i) = L(i) * R(i),我们需要找到 MAX(i) 的最大值,其中 1 <= i <= N。
输入格式
总共有两行,第一行是数组长度 N,第二个是空格分割的所有数组的内容。
输出格式
输出 MAX(i) 的最大值。
输入样例
5
5 4 3 4 5
输出样例
8
思路分析
计算 L(i):
从左到右遍历数组,使用一个栈来存储元素的索引。
对于每个元素 a[i],如果栈顶元素对应的值大于 a[i],则 L(i) 为栈顶元素的索引;否则,弹出栈顶元素,直到找到满足条件的元素或栈为空。
计算 R(i):
从右到左遍历数组,使用一个栈来存储元素的索引。
对于每个元素 a[i],如果栈顶元素对应的值大于 a[i],则 R(i) 为栈顶元素的索引;否则,弹出栈顶元素,直到找到满足条件的元素或栈为空。
计算 MAX(i):
遍历数组,计算每个 i 对应的 L(i) * R(i),并记录最大值。
完整代码
cpp
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
int solution(int size,const vector<int>& a) {
int n = a.size();
vector<int> L(n, 0);
vector<int> R(n, 0);
// 计算 L(i)
stack<int> s;
for (int i = 0; i < n; ++i) {
while (!s.empty() && a[s.top()] <= a[i]) {
s.pop();
}
if (!s.empty()) {
L[i] = s.top() + 1; // 因为题目要求的是 1-based index
}
s.push(i);
}
// 清空栈
while (!s.empty()) {
s.pop();
}
// 计算 R(i)
for (int i = n - 1; i >= 0; --i) {
while (!s.empty() && a[s.top()] <= a[i]) {
s.pop();
}
if (!s.empty()) {
R[i] = s.top() + 1; // 因为题目要求的是 1-based index
}
s.push(i);
}
// 计算 MAX(i)
int maxProduct = 0;
for (int i = 0; i < n; ++i) {
maxProduct = max(maxProduct, L[i] * R[i]);
}
return maxProduct;
}
int main() {
// Add your test cases here
std::cout << (solution(5, {5, 4, 3, 4, 5}) == 8) << std::endl;
return 0;
}