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;
}
相关推荐
人才程序员31 分钟前
【C++拓展】vs2022使用SQlite3
c语言·开发语言·数据库·c++·qt·ui·sqlite
不能只会打代码1 小时前
蓝桥杯例题一
算法·蓝桥杯
OKkankan1 小时前
实现二叉树_堆
c语言·数据结构·c++·算法
指尖下的技术2 小时前
Mysql面试题----为什么B+树比B树更适合实现数据库索引
数据结构·数据库·b树·mysql
Ciderw2 小时前
MySQL为什么使用B+树?B+树和B树的区别
c++·后端·b树·mysql·面试·golang·b+树
yerennuo2 小时前
windows第七章 MFC类CWinApp介绍
c++·windows·mfc
ExRoc2 小时前
蓝桥杯真题 - 填充 - 题解
c++·算法·蓝桥杯
利刃大大3 小时前
【二叉树的深搜】二叉树剪枝
c++·算法·dfs·剪枝
肖田变强不变秃4 小时前
C++实现有限元计算 矩阵装配Assembly类
开发语言·c++·矩阵·有限元·ansys
c++初学者ABC5 小时前
学生管理系统C++版(简单版)详解
c++·结构体·学生管理系统