1. 题目解析
Leetcode链接:904. 水果成篮
题目所述,其实就是要找出一个包含不超过两种数字的最长子数组。
2. 算法原理
使用滑动窗口来解决这道题题目,
为什么这样做呢?
让我们来简单分析一下,
我们可以通过维护一个哈希表来表示窗口,
当right指针向右移动进入窗口时,如果出现了三个种类的水果,那么就移动left指针,
left指针移动有两种情况,
-
如果仍然有三种水果,那么就让left继续向右移动++
-
如果剩下两种水果,那么就记录结果,这时就是关键,
此时,right指针是否需要回到left的位置重新移动呢?其实不需要,这就是滑动窗口的核心,
我们只需要让right指针继续向右移动进入窗口即可。
3. 代码编写
class Solution {
public:
int totalFruit(vector<int>& f) {
int hash[100001] = { 0 };
int ret = 0;
for(int left = 0, right = 0, kinds = 0; right < f.size(); right++)
{
if(hash[f[right]] == 0) kinds++;
hash[f[right]]++;
while(kinds > 2)
{
hash[f[left]]--;
if(hash[f[left]] == 0) kinds--;
left++;
}
ret = max(ret, right - left + 1);
}
return ret;
}
};
The Last
嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。
觉得有点收获的话,不妨给我点个赞吧!
如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~