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 nums[i] <= nums[j]. 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): nums[1] = 0 and nums[5] = 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): nums[2] = 1 and nums[9] = 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 <= nums[i] <= 5 * 10^4 0<=nums[i]<=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 nums[i] 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 nums[stack[top]] <= nums[j], then (stack[top], j) forms a valid ramp.

  • Calculate width j - stack[top], 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;
}
相关推荐
CoderCodingNo7 小时前
【NOIP】2011真题解析 luogu-P1003 铺地毯 | GESP三、四级以上可练习
算法
iFlyCai7 小时前
C语言中的指针
c语言·数据结构·算法
查古穆8 小时前
栈-有效的括号
java·数据结构·算法
再一次等风来8 小时前
近场声全息(NAH)仿真实现:从阵列实值信号到波数域重建
算法·matlab·信号处理·近场声全息·nah
汀、人工智能8 小时前
16 - 高级特性
数据结构·算法·数据库架构·图论·16 - 高级特性
大熊背8 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
XWalnut8 小时前
LeetCode刷题 day4
算法·leetcode·职场和发展
蒸汽求职8 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
AI成长日志9 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
旖-旎9 小时前
分治(库存管理|||)(4)
c++·算法·leetcode·排序算法·快速选择算法