LeetCode //C - 962. Maximum Width Ramp

962. Maximum Width Ramp

A ramp in an integer array nums is a pair (i, j) for which i < j and numsi <= numsj. The width of such a ramp is j - i.

Given an integer array nums, return the maximum width of a ramp in nums. If there is no ramp in nums, return 0.

Example 1:

Input: nums = 6,0,8,2,1,5
Output: 4
Explanation: The maximum width ramp is achieved at (i, j) = (1, 5): nums1 = 0 and nums5 = 5.

Example 2:

Input: nums = 9,8,1,0,1,9,4,0,4,1
Output: 7
Explanation: The maximum width ramp is achieved at (i, j) = (2, 9): nums2 = 1 and nums9 = 1.

Constraints:
  • 2 < = n u m s . l e n g t h < = 5 ∗ 10 4 2 <= nums.length <= 5 * 10^4 2<=nums.length<=5∗104
  • 0 < = n u m s i < = 5 ∗ 10 4 0 <= numsi <= 5 * 10^4 0<=numsi<=5∗104

From: LeetCode

Link: 962. Maximum Width Ramp


Solution:

Ideas:
  • Build a monotonic decreasing stack of indices from left to right.

    → Stack keeps positions where numsi is a new minimum.

  • A smaller left value has the best chance to form the widest ramp later.

  • Traverse from the right to left (j from end to start):

    → If numsstack\[top] <= numsj, then (stacktop, j) forms a valid ramp.

  • Calculate width j - stacktop, update maximum width.

  • Pop the index from the stack because earlier j will produce smaller widths.

  • Continue until stack is empty or j is done.

  • Return the maximum width found.

Code:
c 复制代码
int maxWidthRamp(int* nums, int numsSize) {
    if (numsSize < 2) return 0;

    // Monotonic decreasing stack of indices
    int *stack = (int *)malloc(numsSize * sizeof(int));
    int top = -1;

    // Build stack: store indices where nums[i] is a new minimum from the left
    for (int i = 0; i < numsSize; ++i) {
        if (top == -1 || nums[i] < nums[stack[top]]) {
            stack[++top] = i;
        }
    }

    int maxWidth = 0;

    // Scan from the right, try to widen ramps using the stack
    for (int j = numsSize - 1; j >= 0 && top >= 0; --j) {
        // While current value can form a ramp with stack[top]
        while (top >= 0 && nums[stack[top]] <= nums[j]) {
            int width = j - stack[top];
            if (width > maxWidth) maxWidth = width;
            --top;  // Pop because any earlier j will only give smaller width
        }
    }

    free(stack);
    return maxWidth;
}
相关推荐
s_w.h2 小时前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash
信奥卷王2 小时前
2025年09月GESPC++五级真题解析(含视频)
算法
白狐_7982 小时前
408 数据结构|外部排序:流程与 k 路归并
数据结构·算法
闻缺陷则喜何志丹2 小时前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
AAA代码批发商3 小时前
Days 39 Linux C 开发之 SQLite 数据库完整学习笔记
linux·c语言·数据库
leihefeng3 小时前
手写数字识别:KNN vs 逻辑回归实战
python·算法·机器学习·逻辑回归·scikit-learn
全栈技术负责人3 小时前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程
mmmmath_34 小时前
面试题 02.07. 链表相交
算法·链表
圣保罗的大教堂4 小时前
leetcode 3903. 最小稳定下标 I 简单
leetcode
卢锡荣4 小时前
单芯掌控多口互联|乐得瑞 LDR6020 PD3.1 多通道 Type‑C 控制 SOC 芯片
c语言·开发语言