题目:
解析:
题目简介:一个树上有多种水果,当我们只能取其中连续并且长度最长的两种水果。
先定义左右指针将他们指向数组的0下标,让right先走,同时用哈希表记录走过的水果种类,如果种类超过2的话,就让left走一步,如果left指向位置的水果种类的数量为0,那么就从哈希表中移除该水果,直到right走向数组的最后,放回right和left的相差距离即可。
代码:
代码1(哈希表):
public int totalFruit(int[] fruits) {
Map<Integer,Integer> hashMap=new HashMap<Integer,Integer>();
int ret=0;
for(int left=0,right=0;right<fruits.length;right++){
int in=fruits[right];
hashMap.put(in,hashMap.getOrDefault(in,0)+1);
while(hashMap.size()>2){
int out=fruits[left];
hashMap.put(out,hashMap.get(out)-1);
if(hashMap.get(out)==0){
hashMap.remove(out);
}
left++;
}
ret=Math.max(ret,right-left+1);
}
return ret;
}
代码2(数组模拟哈希表);
public int totalFruit(int[] fruits) {
int [] hashMap=new int[fruits.length+1];
int ret=0;
int kind=0;
for(int left=0,right=0;right<fruits.length;right++){
int in=fruits[right];
if(hashMap[in]==0) kind++;
hashMap[in]++;
while(kind>2){
int out=fruits[left];
hashMap[out]--;
if(hashMap[out]==0) kind--;
left++;
}
ret=Math.max(ret,right-left+1);
}
return ret;
}