思路:
通过阅读上面文字得出问题:就去只有两个种类的最大长度的连续子数组,这时我们可以想到用哈希表来存储数据,记录数据的种类和每个种类的数量。
解法一:暴力递归(right每次遍历完都回退)
解法二:滑动窗口
- 定义left、right为0两个变量,固定left,遍历right,将right位置的值存入哈希表,并且记录下该值的数量
- 当哈希表的长度大于2时,减去哈希表中left位置的值的数量,当减到零的时候,将该值删除
- 更新结果
代码:
public int totalFruit(int[] f) {
int ret = 0;
//将数据存储在哈希表中
Map<Integer,Integer> hash = new HashMap<>();
for(int left = 0,right = 0; right < f.length; right++){
int in = f[right];
//进窗口
hash.put(in,hash.getOrDefault(in,0)+1);
//判断
while(hash.size() > 2){
int out = f[left++];
//出窗口
hash.put(out,hash.get(out) - 1);
//当该数据为0 =时,就在哈希表中删除
if(hash.get(out) == 0){
hash.remove(out);
}
}
//更新结果
ret = Math.max(ret, right - left +1);
}
return ret;
}