滑动窗口升级版,蒟蒻阵亡了。。。
思路:最关键的是用哈希储存当前水果id的可采摘数目
代码:
class Solution {
public:
int totalFruit(vector<int>& fruits) {
//由题意,转化问题为:求只包含两种元素的最长连续子序列
//滑动窗口法
int i = 0; //滑动窗口左边界
int sub_len = 0; //子序列长度
int fruit_counter = 0; //篮子中的水果种类数
int len = fruits.size();
unordered_map<int, int> basket; //创建篮子
for (int j = 0; j < len; j++) {
if (basket[fruits[j]] == 0) {
fruit_counter++;
}
basket[fruits[j]]++; //因为value是int属性、初始值为0,相当于将fruits的元素作为key依次放入哈希表basket中,并更新对应value(表示该key的出现次数)
//如果篮子中的水果数目超过两种,则需要移动左边界,对应从子序列中删去水果的value要减一
for (;fruit_counter > 2; i++) {
basket[fruits[i]]--;
//若对应水果key的value变为0,说明篮子里已经没有这种水果了,水果种类要对应变化
if (basket[fruits[i]] == 0) {
fruit_counter--;
}
}
//在第二个for循环结束后,篮子中的水果一定满足题意要求,此时更新子序列长度
sub_len = max(sub_len, j - i + 1);
}
return sub_len;
}
};