文章目录
- 1.题目描述
- 2.算法思路
- 3.完整代码
- 容器做法
- 数组做法
1.题目描述
看到这种题目,总觉得自己在做阅读理解,晕了,题目要求我们在一个数组里分别找出两种数字,并统计这两种数字分别出现一共是多少。
2.算法思路
采用哈希表+滑动窗口的做法:
- 定义一个哈希表方便存储,因为数组里面都是数字,将数组转换成下标可以准确的记录下来。
- 进窗口:如果哈希表存储大小不超过2,将其存储对应下标。
- 出窗口:如果哈希表存储大小超过2,使窗口向前移动,删除哈希表里对应的数字。
3.完整代码
容器做法
class Solution {
public:
int totalFruit(vector<int>& fruits) {
//容器做法
unordered_map<int,int> hash;
int left=0,right=0,ret=-1;
for(;right<fruits.size();right++)
{
//进窗口
hash[fruits[right]]++;
//判断
while(hash.size()>2)
{
//出窗口
hash[fruits[left]]--;
if(hash[fruits[left]]==0)
hash.erase(fruits[left]);
left++;
}
//更新
ret = max(ret,right-left+1);
}
return ret;
}
};
数组做法
class Solution {
public:
int totalFruit(vector<int>& fruits) {
//数组做法
int hash[114514]={0};
int left=0,right=0,ret=-1,kinds=0;
for(;right<fruits.size();right++)
{
//进窗口
if(hash[fruits[right]]==0)kinds++;
hash[fruits[right]]++;
//判断
while(kinds>2)
{
//出窗口
hash[fruits[left]]--;
if(hash[fruits[left]]==0)kinds--;
left++;
}
//更新
ret = max(ret,right-left+1);
}
return ret;
}
};