滑动窗口
使用滑动窗口,并使用fruitA和fruitB对目前可以摘的水果进行记录,当右指针在移动时如果出现了新的水果,就将左指针移到右指针的前一位,进行倒车,直到出现第三种水果就停下,以此保证滑动窗口中永远只有两种水果。
代码:
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int ans = 0, left = 0, right = 0;
int A = fruits[left], B = fruits[right];
while(right < fruits.size()) {
if (fruits[right] == A || fruits[right] == B) {
ans = max(ans, right - left + 1);
right++;
} else {
left = right - 1;
A = fruits[left];
while (left > 0 && fruits[left - 1] == A) //注意此处left要大于0
left--;
ans = max(ans, right - left + 1);
B = fruits[right];
}
}
return ans;
}
};
时间复杂度:O(n).
空间复杂度:O(1)。