class Solution {
public int totalFruit(int[] tree) {
// 只能选两种类型的水果
// 保证这两种类型的果树最多
// 看只有两种类型水果的一个区间中果树有多少
// 遍历记录前一个水果类型和当前的水果类型,num>2记录一下区间?
// 滑动窗口类型:使用双指针,遍历,不一样的数字如果大于2就结束,确定区间,计算其中的果树
int ans = 0;
int i = 0;
// 定义Counter类,方便取和增加操作
Counter count = new Counter();
// 遍历数组
for(int j = 0; j< tree.length;j++){
// 插入树中元素,记录当前类型水果果树的个数
count.add(tree[j],1);
// 大于3的情况,移除前面的值,i往后滑动
while(count.size()>=3){
count.add(tree[i],-1);
if(count.get(tree[i])==0){
count.remove(tree[i]);
}
i++;
}
// 如果不大于3的情况,看当前的最大的果树数目
ans = Math.max(ans,j-i+1);
}
return ans;
}
}
// 定义一个类型,方便查操作
class Counter extends HashMap<Integer,Integer>{
public int get(int k){
return containsKey(k) ? super.get(k) : 0;
}
public void add(int k,int v){
put(k,get(k)+v);
}
}
每日一道Leetcode-904. 水果成篮【双指针|滑动窗口】
猜你喜欢
转载自blog.csdn.net/weixin_41041275/article/details/111355057
今日推荐
周排行