思路:
通过阅读上面文字得出问题:就去只有两个种类的最大长度的连续子数组,这时我们可以想到用哈希表来存储数据,记录数据的种类和每个种类的数量。
解法一:暴力递归(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;}