失败案例:模拟、暴力,倒数第二个例子t了,呜呜
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int len=fruits.size();
int num1=-1,num2=-1;
int chang=0;
int i;
int ans=-1;
for(i=0;i<len;i++){
if(num1==-1&&num2==-1){
num1=fruits[i];
chang++;
//cout<<"*1"<<endl;
}
else if(num1!=-1&&num2==-1&&fruits[i]!=num1){
num2=fruits[i];
chang++;
//cout<<"*2"<<endl;
}
else if(num1!=-1&&num2==-1&&fruits[i]==num1){
chang++;
//cout<<"*2"<<endl;
}
else if(num1!=-1&&num2!=-1&&(num1==fruits[i]||num2==fruits[i])){
chang++;
//cout<<"*3"<<endl;
}
else if(num1!=-1&&num2!=-1&&(num1!=fruits[i]||num2!=fruits[i])){
ans=max(ans,chang);
num1=fruits[i-1];
num2=fruits[i];
int cnt=0;
for(int j=i-1;j>=0;j--){
if(fruits[j]==num1) cnt++;
else break;
}
chang=cnt+1;
//cout<<"*4"<<endl;
}
cout<<num1<<" "<<num2<<endl;
cout<<chang<<endl;
ans=max(ans,chang);
}
return ans;
}
};
使用滑动窗口,主要俺没想起来用map,>_>
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int n = fruits.size();
unordered_map<int, int> cnt;
int left = 0, ans = 0;
for (int right = 0; right < n; ++right) {
++cnt[fruits[right]];
while (cnt.size() > 2) {
auto it = cnt.find(fruits[left]);
--it->second;
if (it->second == 0) {
cnt.erase(it);
}
++left;
}
ans = max(ans, right - left + 1);
}
return ans;
}
};