【Leetcode】1950. Maximum of Minimum Values in All Subarrays

这篇博客介绍了如何运用单调栈解决LeetCode上的一个问题,即找到数组中所有长度为i+1的子数组的最小值的最大者。算法实现过程中详细解释了单调栈的作用,以及如何通过栈来跟踪并更新每个询问的答案。最终,通过逆序遍历并更新结果数组,得到了正确答案。整个算法的时间复杂度为O(n)。
摘要由CSDN通过智能技术生成

题目地址:

https://leetcode.com/problems/maximum-of-minimum-values-in-all-subarrays/

给定一个长 n n n的数组 A A A,要求返回一个数组 B B B,使得 B [ i ] B[i] B[i] A A A中所有长 i + 1 i+1 i+1的区间的最小值的最大者。

设询问的答案 q i q_i qi是所有长 i i i的区间的最小值的最大者。思路是单调栈。考虑一个严格单调递增的栈 s s s,栈存下标。那么当 s [ k ] s[k] s[k]需要弹出的时候,假设是遍历到了 A [ i ] A[i] A[i],并且此时栈顶为 j j j,那么我们就知道了 A [ i ] A[i] A[i]一定是 A [ j + 1 : i − 1 ] A[j+1:i-1] A[j+1:i1]这一段的最小数,从而 A [ i ] A[i] A[i] q i − 1 − j q_{i-1-j} qi1j的备选。如果栈空,或者遍历完成之后清空栈的时候,也可以得到若干类似的结论。我们将这个暂时得到的所有询问的答案记为 C C C。显然 ∀ i , q i ≥ q i + 1 \forall i, q_i\ge q_{i+1} i,qiqi+1,所以最后我们要逆序遍历 C C C,并且将 C [ i ] C[i] C[i]更新为 max ⁡ { C [ i ] , C [ i + 1 ] } \max\{C[i],C[i+1]\} max{C[i],C[i+1]}。最后得到的 C C C即为答案。算法正确性可以由如下观察得知:设 x = q k x=q_k x=qk,并且此处的 k k k取最大,那么 x x x这个数一定在某个时刻成为了栈顶,并且 x x x恰好会去更新 q k q_k qk。代码如下:

class Solution {
 public:
  vector<int> findMaximums(vector<int>& A) {
    int n = A.size();
    vector<int> res(n);
    stack<int> stk;
    for (int i = 0; i <= n; i++) {
      while (stk.size() && (i == n || A[stk.top()] > A[i])) {
        int t = stk.top(), k = i - 1;
        stk.pop();
        if (stk.size()) k -= stk.top() + 1;
        res[k] = max(res[k], A[t]);
      }

      stk.push(i);
    }

    for (int i = res.size() - 1; i; i--) res[i - 1] = max(res[i - 1], res[i]);
    return res;
  }
};

时空复杂度 O ( n ) O(n) O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值