1. 水果成篮
题目描述:

示例:

题目链接: 水果成篮
题解:
首先解读题意,简单来说就是找到一个区间,其中的果树种类用数字表示,种类不超过两种。题目默认是能找到至少两种水果,所以求在此前提下能找到的最长区间是多少?

解题思路
或许该题可以使用暴力解法解决,但明显时间复杂度太高无法通过示例。因此根据前些题目的经验,由于是找区间,而且要统计种类数量,采用滑动窗口加哈希表。

具体的窗口滑动如图所示。

先让第一个数据录入,即进窗口,判断不断循环,然后 right 依次向后移并不断往哈希表录入每个位置种类和更新数据,直到哈希表内的键值对大于 2,即种类大于 2;此时 left 减去第一个数据,即出窗口,判断不断循环,然后不断向后移直到哈希表里的一个种类数据变为 0,对其进行 erase 操作减少一个种类,再次开始更新数据。
代码实现
#include <iostream>
#include <vector>
#include <unordered_map>
using std;
{
:
{
unordered_map<, > hash;
ret = , n = fruits.();
( left = , right = ; right < n; ++right) {
hash[fruits[right]]++;
(hash.() > ) {
hash[fruits[left]]--;
(hash[fruits[left]] == ) {
hash.(fruits[left]);
}
left++;
}
ret = (ret, right - left + );
}
ret;
}
};





















