MarsCode--寻找最大值【中等】

对于一个有 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;
}
相关推荐
感哥15 分钟前
C++ 多态
c++
沐怡旸7 小时前
【底层机制】std::string 解决的痛点?是什么?怎么实现的?怎么正确用?
c++·面试
NAGNIP8 小时前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队9 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
River41610 小时前
Javer 学 c++(十三):引用篇
c++·后端
感哥13 小时前
C++ std::set
c++
Fanxt_Ja13 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下13 小时前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶13 小时前
算法 --- 字符串
算法
博笙困了14 小时前
AcWing学习——差分
c++·算法