面对这种同类型数量统计问题或者是查重问题,哈希表是不二之选,需熟练掌握哈希表的性质,知道何时使用该使用哈希表
//思路分析:
1、右指针向右移动,记录移动过程中每一个种类类别,及其数量,使用哈希表进行统计,并依次记录左右指针长度,即收集水果最大数目
2、当种类类别 > 2时,左指针开始移动,并从左边依次减少对应种类的数量,直至种类类别 == 2, 然后记录此次左右指针长度,即收集水果最大数目
3、不断循环,直至右指针移动至最右端
https ://blog.csdn.net/Bellwen/article/details/128185472
//使用unordered_map
//由于 unordered_map 容器底层采用的是哈希表存储结构,
//该结构本身不具有对数据的排序功能,所以此容器内部不会自行对存储的键值对进行排序。
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int ans = 0; //水果数量
int classNum = 0; //记录种类
//哈希表 键:存储的是果树种类 值:存储的是对应种类数目
unordered_map<int, int> hashmap; //底层采用哈希表存储结构
for (int i = 0, j = 0; j < fruits.size(); j++) {
// 1、j 向右移动,记录移动过程中每一个种类类别,及其数量,使用哈希表进行统计
if (hashmap[fruits[j]] == 0) { //当前树种类为0个,说明是新的种类
classNum++; // 窗口种类数目+1
}
hashmap[fruits[j]]++; // 统计果树种类数目
//2、种类类别 > 2时,i 开始移动,并从左边依次减少对应种类的数量,直至种类类别 == 2,
while (hashmap.size() > 2) { //窗口种类数目大于2 需要收缩窗口
hashmap[fruits[i]]--; //左端丢弃: 减少左指针对应种类的值
if (hashmap[fruits[i]] == 0) { //收缩到任意类型数目为0为止
hashmap.erase(fruits[i]); //当此fruits[i] 类别的数量为0时,应erase进行删除,不然会影响size的判断
classNum--;
}
i++; // i 开始移动
}
//并依次记录左右指针长度 即收集水果最大数目
//ans = max(ans, i - j + 1);
ans = ans > (j - i + 1) ? ans : (j - i + 1); //取最大值
}
return ans;
}
};
int main(int argc,char const *argv[]) {
//测试
vector<int> fruits;
fruits.push_back(0);
fruits.push_back(1);
fruits.push_back(2);
fruits.push_back(2);
Solution s;
cout << s.totalFruit(fruits) << endl;
system("pause");
return 0;
}