刷题-双指针 | 豆包MarsCode AI刷题

92 阅读3分钟

最小替换子串长度问题

问题分析

  1. 字符串特性

    • 字符串的长度是 4 的倍数,且只包含 A, S, D, F 四种字符。
    • 为了使字符串的 "平衡" 状态,要求每种字符的频次相等,即每个字符的数量都为 n / 4n 是字符串长度)。
  2. 目标

    • 替换字符串的某个子串,使得四个字符的频次均等,并且需要找到最短的子串替换长度。
  3. 关键点

    • 初始判断:如果字符串初始状态下四种字符频次已经符合条件,直接返回 0
    • 最短子串问题:找到最短的子串,替换后满足平衡条件。

解决思路

  1. 特殊情况

    • 遍历统计 A, S, D, F 的初始频次,如果它们均不超过 n / 4,则说明字符串已经是平衡的,直接返回 0
  2. 滑动窗口算法

    • 使用滑动窗口从左到右遍历字符串,窗口的左指针 l 和右指针 r 用来动态表示当前窗口的范围。
    • 通过 hashmap 统计窗口外的字符频次,更新 A, S, D, F 的剩余数量。
    • 当窗口内的字符替换后,剩余的字符频次满足条件时,尝试收缩左指针 l,以找到更小的子串长度。
  3. 实现步骤

    • 初始化一个 hashmap 记录初始的 A, S, D, F 频次。
    • 移动右指针 r,逐步扩大窗口范围。
    • 当窗口外字符频次符合条件时,记录当前窗口长度,尝试通过移动左指针 l 缩小窗口,更新最小子串长度。
  4. 算法复杂度

    • 时间复杂度:滑动窗口的每个指针只会移动一遍,总时间复杂度为 O(n)
    • 空间复杂度:使用 hashmap 存储字符频次,占用 O(1) 的额外空间。

最大矩形面积问题

问题分析

  1. 数组特性

    • 输入数组中的每个元素表示矩形的高度。
    • 要求找到所有连续的 k 个相邻元素(k 可以变化)组成的矩形的最大面积。
  2. 矩形面积计算

    • 对于每个窗口大小 k,矩形面积可以表示为:
      面积 = k * min(h[i], h[i+1], ..., h[i+k-1])
    • 问题的核心是:如何高效计算任意窗口内的最小值 min(h[i], h[i+1], ..., h[i+k-1])
  3. 目标

    • 遍历所有可能的窗口大小 k,找到所有可能矩形面积中的最大值。

解决思路

  1. 滑动窗口 + 单调队列

    • 单调队列

      • 用一个双端队列维护窗口内的最小值。
      • 单调队列存储数组的下标,保持从队首到队尾对应的高度递增。
    • 滑动窗口

      • 使用滑动窗口从左到右遍历数组,窗口大小动态变化。
      • 窗口每移动一次,更新队列中的最小值,同时计算当前窗口面积。
  2. 实现步骤

    • 遍历数组的每个可能的起点 i,逐步扩大窗口大小 k,直到窗口超出数组范围。
    • 使用单调队列维护当前窗口内的最小值。
    • 对于每个窗口大小 k,计算其矩形面积并更新结果。
  3. 优化

    • 单次窗口滑动和队列操作的时间复杂度是 O(n)
    • 遍历所有起点的总时间复杂度为 O(n^2)
    • 适合较小规模的 n,对于较大规模的数据集,可以尝试使用分治法或动态规划进一步优化。