最小替换子串长度问题
问题分析
-
字符串特性:
- 字符串的长度是 4 的倍数,且只包含
A, S, D, F四种字符。 - 为了使字符串的 "平衡" 状态,要求每种字符的频次相等,即每个字符的数量都为
n / 4(n是字符串长度)。
- 字符串的长度是 4 的倍数,且只包含
-
目标:
- 替换字符串的某个子串,使得四个字符的频次均等,并且需要找到最短的子串替换长度。
-
关键点:
- 初始判断:如果字符串初始状态下四种字符频次已经符合条件,直接返回
0。 - 最短子串问题:找到最短的子串,替换后满足平衡条件。
- 初始判断:如果字符串初始状态下四种字符频次已经符合条件,直接返回
解决思路
-
特殊情况:
- 遍历统计
A, S, D, F的初始频次,如果它们均不超过n / 4,则说明字符串已经是平衡的,直接返回0。
- 遍历统计
-
滑动窗口算法:
- 使用滑动窗口从左到右遍历字符串,窗口的左指针
l和右指针r用来动态表示当前窗口的范围。 - 通过
hashmap统计窗口外的字符频次,更新A, S, D, F的剩余数量。 - 当窗口内的字符替换后,剩余的字符频次满足条件时,尝试收缩左指针
l,以找到更小的子串长度。
- 使用滑动窗口从左到右遍历字符串,窗口的左指针
-
实现步骤:
- 初始化一个
hashmap记录初始的A, S, D, F频次。 - 移动右指针
r,逐步扩大窗口范围。 - 当窗口外字符频次符合条件时,记录当前窗口长度,尝试通过移动左指针
l缩小窗口,更新最小子串长度。
- 初始化一个
-
算法复杂度:
- 时间复杂度:滑动窗口的每个指针只会移动一遍,总时间复杂度为
O(n)。 - 空间复杂度:使用
hashmap存储字符频次,占用O(1)的额外空间。
- 时间复杂度:滑动窗口的每个指针只会移动一遍,总时间复杂度为
最大矩形面积问题
问题分析
-
数组特性:
- 输入数组中的每个元素表示矩形的高度。
- 要求找到所有连续的
k个相邻元素(k可以变化)组成的矩形的最大面积。
-
矩形面积计算:
- 对于每个窗口大小
k,矩形面积可以表示为:
面积 = k * min(h[i], h[i+1], ..., h[i+k-1])。 - 问题的核心是:如何高效计算任意窗口内的最小值
min(h[i], h[i+1], ..., h[i+k-1])。
- 对于每个窗口大小
-
目标:
- 遍历所有可能的窗口大小
k,找到所有可能矩形面积中的最大值。
- 遍历所有可能的窗口大小
解决思路
-
滑动窗口 + 单调队列:
-
单调队列:
- 用一个双端队列维护窗口内的最小值。
- 单调队列存储数组的下标,保持从队首到队尾对应的高度递增。
-
滑动窗口:
- 使用滑动窗口从左到右遍历数组,窗口大小动态变化。
- 窗口每移动一次,更新队列中的最小值,同时计算当前窗口面积。
-
-
实现步骤:
- 遍历数组的每个可能的起点
i,逐步扩大窗口大小k,直到窗口超出数组范围。 - 使用单调队列维护当前窗口内的最小值。
- 对于每个窗口大小
k,计算其矩形面积并更新结果。
- 遍历数组的每个可能的起点
-
优化:
- 单次窗口滑动和队列操作的时间复杂度是
O(n)。 - 遍历所有起点的总时间复杂度为
O(n^2)。 - 适合较小规模的
n,对于较大规模的数据集,可以尝试使用分治法或动态规划进一步优化。
- 单次窗口滑动和队列操作的时间复杂度是