优化的滑动窗口思想:当我们找到重复的数字时,我们可以立即跳过该窗口。即当在哈希表中发现存在该数字时,left直接跳到重复数字的下一位,通过取当前left值和哈希表中该数字所对应的值两者之间的最大值,实现跳到最大重复字符的下一位。例如45665674这样一个数组,当我们遍历到第二个6时,发现哈希表中存在key为6的,更新left的值为3(即键值key为6对应的值value为3),则指向重复数字的下一位(数组中第二个6的位置),这样窗口不用一个个滑动,对于5来说,因为比较left值大小,若小于则不用更新窗口左值。结合代码看就会明白。
注:哈希表的键key对应数组或字符串的值(而不是下标索引),哈希表的值value对应数组或字符串的下标+1。
代码如下:(如果处理的是字符串,则将map的键值类型改为char即可,即map<char,int>a)方法是一样的。
class Solution {
public:
int maxLength(vector<int>& arr) {
if