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

对于一个有 N 个元素的数组,包含如下的元素 a1, a2, ..., an,我们定义了两个函数:

  • L(i) = j 需要满足的条件如下:

    • j < i
    • aj > ai
    • 如果找不到 j 的话,那么 L(i) = 0;如果有多个 j 的话,选择离 i 最近的那一个
  • R(i) = k 需要满足的条件如下:

    • k > i
    • ak > ai
    • 如果找不到 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):

从左到右遍历数组,使用一个栈来存储元素的索引。

对于每个元素 ai,如果栈顶元素对应的值大于 ai,则 L(i) 为栈顶元素的索引;否则,弹出栈顶元素,直到找到满足条件的元素或栈为空。

计算 R(i):

从右到左遍历数组,使用一个栈来存储元素的索引。

对于每个元素 ai,如果栈顶元素对应的值大于 ai,则 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;
}
相关推荐
小小、码农11 分钟前
C++11右值引用与移动语义 —— 从拷贝资源到转移资源
开发语言·网络·c++·网络协议
明志数科18 分钟前
具身智能真机采集工程实践:5类高频失效模式与规避清单
人工智能·算法·机器学习
CSDN_RTKLIB18 分钟前
空间哈希与拓扑缓存
算法
大熊背2 小时前
IspPipeline色相旋转模块实现
人工智能·算法·计算机视觉
爱学习的小白柏2 小时前
同城双活的核心不是双活,是逼着数据别出机房
大数据·人工智能·算法·langchain·ai编程
charlie1145141912 小时前
C++ 的新标准容器:flat_map、inplace_vector 与 mdspan
开发语言·c++·开源项目
鹿角片ljp2 小时前
LeetCode 31:下一个排列|右找小,右找大,交换,右反转
java·数据结构·算法
唠玖馆2 小时前
c++AVL树
开发语言·c++
彧azz3 小时前
B树原理与C语言实现
c语言·数据结构·b树
蓝速科技3 小时前
酒店门店 AI 数字人前台场景适配与落地指南
大数据·运维·数据结构·数据库·人工智能·科技