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;
}
相关推荐
智者知已应修善业6 小时前
【任何一个自然数m的立方均可写成m个连续奇数之和】2024-10-17
c语言·数据结构·c++·经验分享·笔记·算法
YYYing.6 小时前
【Linux/C++多线程篇(二) 】给线程装上“红绿灯”:通俗易懂的同步互斥机制讲解 & C++ 11下的多线程
linux·c语言·c++·经验分享·ubuntu
阿里嘎多哈基米6 小时前
速通Hot100-Day07——栈
数据结构·算法·leetcode··队列·hot100
一叶落4386 小时前
LeetCode 135. 分发糖果(C语言)| 贪心算法 + 双向遍历详解
c语言·数据结构·算法·leetcode·贪心算法·哈希算法
2401_900151546 小时前
自定义异常类设计
开发语言·c++·算法
努力学算法的蒟蒻6 小时前
day113(3.15)——leetcode面试经典150
算法·leetcode·职场和发展
李斯啦果6 小时前
【C语言】统计对称素数
c语言·开发语言
一叶落4386 小时前
LeetCode 42. 接雨水(C语言详解)——双指针经典解法
c语言·数据结构·c++·算法·leetcode
寂柒6 小时前
哈希桶——模拟实现哈希表
数据结构·c++·算法
郝学胜-神的一滴6 小时前
一序平衡,括号归真:单括号匹配算法的优雅美学
java·前端·数据结构·c++·python·算法