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;
}
相关推荐
m0_672703312 小时前
上机练习第29天
算法
兩尛2 小时前
409. 最长回文串
c++·算法·leetcode
(❁´◡`❁)Jimmy(❁´◡`❁)2 小时前
【KMP】算法详解
算法
智者知已应修善业2 小时前
【pta反转加法构造回文数c语言1000位】2025-1-31
c语言·c++·经验分享·笔记·算法
List<String> error_P2 小时前
蓝桥杯基础知识点:模拟-数位操作类题目
python·算法·蓝桥杯
陈天伟教授2 小时前
人工智能应用- 材料微观:04.微观结构:金属疲劳
人工智能·神经网络·算法·机器学习·推荐算法
样例过了就是过了2 小时前
LeetCode热题100 螺旋矩阵
算法·leetcode·矩阵
敲代码的哈吉蜂2 小时前
haproxy的算法——动态算法
算法
追随者永远是胜利者2 小时前
(LeetCode-Hot100)226. 翻转二叉树
java·算法·leetcode·职场和发展·go