LeetCode 962.最大宽度坡

给定一个整数数组 A,坡是元组 (i, j),其中 i < j 且 A[i] <= A[j]。这样的坡的宽度为 j - i。

找出 A 中的坡的最大宽度,如果不存在,返回 0 。

示例 1:

输入:[6,0,8,2,1,5]

输出:4

解释:

最大宽度的坡为 (i, j) = (1, 5): A[1] = 0 且 A[5] = 5.

示例 2:

输入:[9,8,1,0,1,9,4,0,4,1]

输出:7

解释:

最大宽度的坡为 (i, j) = (2, 9): A[2] = 1 且 A[9] = 1.

提示:

2 <= A.length <= 50000

0 <= A[i] <= 50000

首先,我们先从后向前遍历数组,构建一个越靠近栈顶越大的栈,之后从前向后遍历数组,如果遍历到的数字比栈顶数字小,就将当前坡的宽度作为可能的答案:

cpp 复制代码
class Solution {
public:
    int maxWidthRamp(vector<int>& nums) {
        stack<int> stk;
        for (int i = nums.size() - 1; i >= 0; --i) {
            if (stk.empty() || nums[i] >= nums[stk.top()]) {
                stk.push(i);
            }
        }

        int ans = 0;
        for (int i = 0; i < nums.size(); ++i) {
            while (!stk.empty() && nums[i] <= nums[stk.top()]) {
                ans = max(ans, stk.top() - i);
                stk.pop();
            }

            if (stk.empty()) {
                break;
            }
        }

        return ans;
    }
};

如果nums的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(n)。

相关推荐
无限进步_14 小时前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
WL_Aurora14 小时前
Python 算法基础篇之排序算法(一):冒泡、选择、插入
python·算法·排序算法
凌波粒14 小时前
LeetCode--257. 二叉树的所有路径(二叉树)
算法·leetcode·职场和发展
AI算法沐枫14 小时前
大一学生如何入门机器学习,深度学习,学习顺序如何?
人工智能·python·深度学习·学习·线性代数·算法·机器学习
codealy14 小时前
Rust 核心理论: 高并发与异步(三)
算法·rust
日月云棠14 小时前
JAVA数据结构与算法 - 基础:常用集合简述
java·算法
TYKJ02314 小时前
带宽100M但传输只有30M?你的服务器可能该换TCP算法了
后端·算法
SilentSamsara14 小时前
运算符重载:让自定义对象支持 +、[]、in 操作
开发语言·python·算法·青少年编程·pycharm
日月云棠14 小时前
JAVA数据结构与算法 - 基础:BlockingQueue
java·算法