Java C++题解leetcode904水果成篮
作者:AnjaVon 发布时间:2023-12-08 21:06:09
标签:Java,C++,题解,水果成篮
题目要求
阅读理解
读完题的我be like:
去看了遍英文版就懂了,题目中的种类【type】不是种类数……每个数字代表一种树【用个字母啥的表示或者翻译成类型就好理解多了】,那么目标就是找从哪里开始可以维持两种数字(种类)无规律交替出现的状态最久,这个最久是多少棵树。
思路:滑动窗口
窗口里可放两棵树,一棵是枣树,另一棵还是枣树。 向后遍历整排树,并更新最长状态。
Java
数组
class Solution {
public int totalFruit(int[] fruits) {
int res = 0;
int[] win = new int[fruits.length + 10];
for (int l = 0, r = 0, tot = 0; r < fruits.length; r++) {
if (++win[fruits[r]] == 1)
tot++; // 当前种类统计
while (tot > 2) {
if (--win[fruits[l++]] == 0)
tot--;
}
res = Math.max(res, r - l + 1); // 维护最长状态
}
return res;
}
}
时间复杂度:O(n)
空间复杂度:O(n)
哈希表
可使用哈希表构建窗口,降低空间复杂度。
键对应篮子,值对应同类树数量;
当值为000注意要彻底删掉键。
class Solution {
public int totalFruit(int[] fruits) {
Map<Integer, Integer> win = new HashMap<Integer, Integer>();
int l = 0, res = 0;
for (int r = 0; r < fruits.length; r++) {
win.put(fruits[r], win.getOrDefault(fruits[r], 0) + 1);
while (win.size() > 2) { // 窗口大小即种类数
win.put(fruits[l], win.get(fruits[l]) - 1);
if (win.get(fruits[l]) == 0)
win.remove(fruits[l]); // 彻底删除键值
l++;
}
res = Math.max(res, r - l + 1);
}
return res;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
C++
数组
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int res = 0;
int win[fruits.size() + 10];
memset(win, 0, sizeof(win));
for (int l = 0, r = 0, tot = 0; r < fruits.size(); r++) {
if (++win[fruits[r]] == 1)
tot++; // 当前种类统计
while (tot > 2) {
if (--win[fruits[l++]] == 0)
tot--;
}
res = max(res, r - l + 1); // 维护最长状态
}
return res;
}
};
时间复杂度:O(n)
空间复杂度:O(n)
哈希表
可使用哈希表构建窗口,降低空间复杂度。
class Solution {
public:
int totalFruit(vector<int>& fruits) {
unordered_map<int, int> win;
int l = 0, res = 0;
for (int r = 0; r < fruits.size(); r++) {
if (win.count(fruits[r]))
win[fruits[r]]++;
else
win[fruits[r]] = 1;
while (win.size() > 2) { // 窗口大小即种类数
win[fruits[l]]--;
if (win[fruits[l]] == 0)
win.erase(fruits[l]); // 彻底删除键值
l++;
}
res = max(res, r - l + 1);
}
return res;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
总结
今天不想rust了……主体和这两种语言差不多,要多些类型转换balabala的内容
来源:https://juejin.cn/post/7155315083826954248


猜你喜欢
- 下面由我来给大家展示用spring aop实现 * 的例子(电脑打印)下面就看一下具体的代码:先定义一个打印机的接口package aop
- 建立Android项目,如果会的话特别简单,不会的话让自己去琢磨也需要一定的时间!小编之后将自己学习Android的经验给大家分享出来!1、
- 1、概述首先和大家一起回顾一下Java 消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:1.消息服务:一个中间件
- 下面是利用Java实现读写文件功能的示例代码读文件TextRead.javaimport java.io.BufferedReader;im
- 方式一public class Test{ public static void main(String[] args) throws Ex
- 前言本文主要介绍了关于JDK源码分析之String、StringBuilder和StringBuffer的相关内容,分享出来供大家参考学习,
- 前言学过定时任务,但是我忘了,忘得一干二净,害怕,一直听别人说:你写一个定时任务就好了。写个定时任务让他去爬取就行了。我不会,所以现在得补回
- 一、递归的思路一个方法在执行时,调用自身被称为“递归”。递归相当于数学归纳法,有一个起始条件,有一个递推公式。递归可以分为:单路递归和多路递
- 队列简介队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即先存入队列的数据,先取出,后存入的后取出。示意图:(使用数组模拟
- 前言项目使用了SpringBoot构建项目。下面对动态调整日志的级别进行记录。从版本 1.5.1 之后就提供了基于 spring-boot-
- Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户
- 读XMLXmlDocument xd = new XmlDocument(); string fi
- Mybatis log printf工具网页地址: http://www.feedme.ltd/log.htmlMybatis执行的sql的
- XML的特点是功能全面,但标签繁琐,格式复杂。在Web上使用XML现在越来越少,取而代之的是JSON这种数据结构。JSON是JavaScri
- //FilterKalman.csnamespace FusionFiltering{public class FilterKalman &
- 本文主要介绍了idea中同一SpringBoot项目多端口启动,具体如下:现在已经有一个在跑着使用的默认端口 8080选中1,点击2.这个时
- autoMapping和autoMappingBehavior的区别autoMappingBehaviormybatis核心配置文件中set
- 本文实例为大家分享了java实现小球碰撞的具体代码,供大家参考,具体内容如下这次我们做一个小球的碰撞的游戏,规则是:按下添加按钮,窗口的中心
- Spring5新功能一、@Nullable 注解@Nullable 注解可以使用在方法、属性、参数上,分别表示方法返回可以为空、属性值可以为
- gateway网关与前端请求的跨域问题最近因项目需要,引入了gateway网关。可是发现将前端请求的端口指向网关后,用postman发送请求