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;
}
相关推荐
cynicme2 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
ShineSpark3 小时前
Crashpad 在windows下编译和使用指南
c++·windows
Larry_Yanan5 小时前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互
im_AMBER5 小时前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法
凯芸呢5 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea
寂静山林5 小时前
UVa 1030 Image Is Everything
算法
AI柠檬5 小时前
几种排序算法的实现和性能比较
数据结构·算法·c#·排序算法
weixin_429630266 小时前
第6章 支持向量机
算法·机器学习·支持向量机
SweetCode6 小时前
C++ 实现大数加法
开发语言·c++·算法
王哈哈^_^6 小时前
【数据集】【YOLO】【目标检测】共享单车数据集,共享单车识别数据集 3596 张,YOLO自行车识别算法实战训推教程。
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计