【LeetCode---904】水果成篮---滑动窗口
- 定义一个计数器Counter,HashMap的巧用。
- i是最左边的下标,j为右边的下标,j - i + 1就是这个滑动窗口的长度
- 如果长度大于三,那么就要把最左边的那个数给删掉。
- 因为可能有重复的情况:
- 比如3,3,3,3,1,1,2
- 在加入2的时候,要删除第一种果子3,那么我们就需要i一直往后移动,然后判断是否为0,如果0就删除。
- 这样做的好处是,如果只有一个如:31111222,那么删除一次就可以了。然后i++又变为了下一次的指向,即1的开始位置。
import java.util.HashMap;
public class Solution2 {
public static int totalFruit(int[] tree) {
int ans = 0, i = 0;
Counter count = new Counter();
for (int j = 0; j < tree.length; ++j) {
count.add(tree[j], 1);
while (count.size() >= 3) {
count.add(tree[i], -1);
if (count.get(tree[i]) == 0)
count.remove(tree[i]);
i++;
}
ans = Math.max(ans, j - i + 1);
}
return ans;
}
}
class Counter extends HashMap<Integer, Integer> {
public int get(int k) {
return containsKey(k) ? super.get(k) : 0;
}
public void add(int k, int v) {
put(k, get(k) + v);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?