题目:904. 水果成篮
思路:哈希表+双指针,时间复杂度0(n)。
哈希表记录双指针区间元素出现的情况,当哈希表中key的数量大于2时,就需要移动左指针来维护区间。
C++版本:
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int n=fruits.size();
unordered_map<int,int> mp;
int mx=0;
for(int l=0,r=0;r<n;r++){
mp[fruits[r]]++;
while(mp.size()>2){
mp[fruits[l]]--;
if(mp[fruits[l]]==0){
mp.erase(fruits[l]);
}
l++;
}
mx=max(mx,r-l+1);
}
return mx;
}
};
JAVA版本:
class Solution {
public int totalFruit(int[] fruits) {
int n=fruits.length;
Map<Integer,Integer> mp=new HashMap<>();
int mx=0;
for(int l=0,r=0;r<n;r++){
mp.merge(fruits[r],1,Integer::sum);
while(mp.size()>2){
mp.merge(fruits[l],-1,Integer::sum);
if(mp.get(fruits[l])==0){
mp.remove(fruits[l]);
}
l++;
}
mx=Math.max(mx,r-l+1);
}
return mx;
}
}
GO版本:
func totalFruit(fruits []int) int {
n:=len(fruits)
mp:=map[int]int{}
mx:=0
for l,r:=0,0;r<n;r++ {
mp[fruits[r]]++
for len(mp)>2 {
mp[fruits[l]]--
if mp[fruits[l]]==0 {
delete(mp,fruits[l])
}
l++
}
mx=max(mx,r-l+1)
}
return mx
}