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;
}
相关推荐
寒秋花开曾相惜8 小时前
(学习笔记)第四章 处理器体系结构
linux·网络·数据结构·笔记·学习
故事和你918 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__8 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
脱氧核糖核酸__9 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·分糖果
_日拱一卒10 小时前
LeetCode:2两数相加
算法·leetcode·职场和发展
py有趣10 小时前
力扣热门100题之零钱兑换
算法·leetcode
董董灿是个攻城狮10 小时前
Opus 4.7 来了,我并不建议你升级
算法
自我意识的多元宇宙10 小时前
二叉树遍历方式代码解读(2迭代)
数据结构