1.题目描述
2.思路
这题类似于求有两个字符的最长子串。
用一个向量lens记录下标为i的有两种水果的长度,最后输出lens中的最大值即可。
怎么求lens[i]的值呢?这里我们需要两个变量basket1,basket2记录水果的类型,两个变量index1,index2当出现第三种水果类型时可能需要切换的前两种水果的下标。
从左到右遍历tree数组,得到其中的一个元素tree[i]。
1.当basket1为空时,直接将tree[i]赋值给basket1,将i赋值给index1,同时将lens[1]置1。
2.当basket1不为空时:
(1)如果tree[i]==basket1,则len[i]=len[i-1]+1,同时根据tree[i]与tree[i-1]是否相等,决定是否更新index1。
(2)如果tree[i]!=basket1:
- 如果basket2为空,则直接将tree[i]赋值给basket2,将i赋值给index2,同时len[i]=len[i-1]+1。
- 如果basket2不为空:(1)如果tree[i]==basket2,len[i]=len[i-1]+1,同时根据tree[i]与tree[i-1]是否相等,决定是否更新index2; (2)如果tree[i]!=basket2,找到index1和index2中的较大值x和其对应的水果类型y,index1=x,basket1=y,len[i]=i-x+1,index2=i,basket2=tree[i]。
附上代码:
#include <iostream>
#include <vector>
using namespace std;
int totalFruit(vector<int>& tree) {
int len=tree.size();
vector<int> lens(len,0);
int basket1,basket2;
basket1=basket2=-1;
int index1,index2;
index1=index2=-1;
for(int i=0;i<len;i++){
if(i==0){
lens[i]=1;
basket1=tree[i];
index1=i;
continue;
}
if(tree[i]==basket1){
lens[i]=lens[i-1]+1;
if(tree[i]!=tree[i-1])
index1=i;
}
else if(basket2==-1){
basket2=tree[i];
lens[i]=lens[i-1]+1;
index2=i;
}
else{
if(basket2==tree[i]){
lens[i]=lens[i-1]+1;
if(tree[i]!=tree[i-1])
index2=i;
}
else{
if(index1<index2){
index1=index2;
basket1=basket2;
}
lens[i]=i-index1+1;
index2=i;
basket2=tree[i];
}
}
}
//for(auto item:lens)
//cout<<item<<" ";
sort(lens.begin(),lens.end());
return lens.back();
}
int main(){
cout<<"输入树的个数:";
int number;
cin>>number;
if(number<=0)
return -1;
vector<int> test;
for(int i=0;i<number;i++){
int temp;
cin>>temp;
test.push_back(temp);
}
cout<<totalFruit(test);
return 0;
}