这道题目一开始的思路是利用水果的种类大于等于三,来作为滑动窗口的维护条件,使用两个key值来记录两种水果的值,当遇到第三种水果时,则将slowindex设置为slowindex-1,然后将slowindex逐渐缩小,来查找前x个相同的元素,之后重新设置key值,继续搜索。具体代码如下:
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int slowindex = 0;
int fastindex = 1;
int sum= 1;
int kind = 1;
int key1 = fruits[slowindex];
int key2 = -1;
if(fruits.size() == 0){
return 0;
}
while(fastindex < fruits.size()){
if(kind < 2){
if(fruits[fastindex] == key1){
fastindex++;
sum++;
}else if(key2 < 0){
key2 = fruits[fastindex];
kind++;
sum++;
fastindex++;
}
}
if(fruits[fastindex] == key1 || fruits[fastindex] == key2){
sum++;
fastindex++;
}else{
kind++;
}
while(kind >= 3){
slowindex = fastindex - 1;
key1 = fruits[slowindex--];
while(fruits[slowindex] == key1){
slowindex--;
}
key2 = fruits[fastindex];
kind--;
fastindex++;
}
sum = max(sum, fastindex - slowindex - 1);
}
return sum;
}
};
但很快就出了问题,在测试用例 [3,3,3,1,2,1,1,2,3,3,4]时,预期结果为5,而我的代码输出结果却为8,在思考后得出结论:
- sum的更新和维护,在代码1中,没有用到currentsum来记录当前的最大值,仅仅使用了一个sum来计数,导致这个sum在满足条件 fruits[fastindex] == key1 || fruits[fastindex] == key2 时便会增加,从而导致sum不断增加,fastindex - slowindex - 1 不会被取到。修改后的代码如下:
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int slowindex = 0;
int fastindex = 0;
int sum = 0;
int currentsum = 0;
int key1 = fruits[slowindex];
int key2 = -1;
while(fastindex < fruits.size()) {
if (fruits[fastindex] == key1 || fruits[fastindex] == key2) {
currentsum++;
fastindex++;
} else{
if (key2 == -1) {
key2 = fruits[fastindex];
currentsum++;
fastindex++;
}else{
sum = max(sum, currentsum);
currentsum = 2;
slowindex = fastindex - 1;
key1 = fruits[slowindex];
while (slowindex > 0 && fruits[slowindex - 1] == key1) {
currentsum++;
slowindex--;
}
key2 = fruits[fastindex];
fastindex++;
}
}
}
sum = max(sum, currentsum);
return sum;
}
};
这段代码就能够顺利通过了。