滑动窗口升级版,蒟蒻阵亡了。。。
题目:904. 水果成篮 - 力扣(LeetCode)
思路:最关键的是用哈希储存当前水果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;}
};