其实就是:找至多包含两种元素的最长子串,返回其长度
我们可以使用滑动窗口来做这道题,具体思路如下:
1:使用hash表来存储果树和果树上果子的数量
2:定义快慢指针,然后给集合存值,put(果子种类编号,该编号下的果子数量)
3:使用while循环来定义标准:种类不超过2;如果超过2 就要慢指针(left)指向的果树的果子 -1 只要果子种类大于2 就一直减 left也一直++ 直到=0 删去了这个果种,然后记录当前的长度,然后快指针right继续向后遍历。
private static int totalFruit5(int[] fruits) {
int n = fruits.length;
Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();
int left = 0, ans = 0; // 记录并更新最大长度 即最后的返回值
for (int right = 0; right < n; ++right) {
// put右指针 对应的水果类型 并且记录其次数
// 如果有则次数+1 无则为0次+1
// 其实就是用的集合的下标来存水果数的种类
cnt.put(fruits[right], cnt.getOrDefault(fruits[right], 0) + 1);
// 水果种类超过2种 需要收缩窗口 让其只包含2种水果
while (cnt.size() > 2) {
cnt.put(fruits[left], cnt.get(fruits[left]) - 1);
// 为0说明其不在窗口内 移除
if (cnt.get(fruits[left]) == 0) {
// 移除后表内只剩下两个种类 while循环跳出
cnt.remove(fruits[left]);
}
// 移除之后慢指针++ 然后后续判断前面2个种类数的果子能有多长
++left;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}