Java C++题解leetcode904水果成篮

题目描述:

在一个篮子里,你可以放入任意数量的水果,但是你只能放两种水果。篮子里的水果数量是无限的,你能够选择任意两种蔬菜放入篮子中。为了使你的成本最小,请输出你可以收集到的最大水果数。

示例 1:

输入: [1,2,1]
输出: 3
解释:我们可以收集 [1,2,1]。

示例 2:

输入: [0,1,2,2]
输出: 3
解释:我们可以收集 [1,2,2]。
如果我们从第一棵树开始,我们将只能收集到 [0, 1]。

思路:

这是一道滑动窗口题目,要求滑动窗口中只包含两种元素,而这两种元素就是我们要找到的蔬菜。我们需要维护一个窗口,使得窗口内只有两种元素并且窗口大小尽可能大。我们可以使用哈希表(map或unordered_map)来存储窗口内每种元素的数量,如果我们发现窗口内元素数量大于2,则需要缩小窗口。我们可以通过移动左窗口指针来达到缩小窗口的目的。

步骤:

1.定义哈希表来记录窗口内每个元素出现的次数。

2.遍历元素,维护窗口的大小。

3.当窗口内元素数量大于2,则移动左窗口指针,直到窗口内元素数量为2。

4.更新最大蔬菜数量的值。

下面是Java语言的实现代码:

public int totalFruit(int[] tree) {
    int n = tree.length;
    if (n < 3) {
        return n;
    }

    Map<Integer, Integer> map = new HashMap<>();
    int i = 0, j = 0, max = 0;
    while (j < n) {
        int c = tree[j++];
        map.put(c, map.getOrDefault(c, 0) + 1);

        while (map.size() > 2) {
            int d = tree[i++];
            int count = map.get(d);
            if (count == 1) {
                map.remove(d);
            } else {
                map.put(d, count - 1);
            }
        }
        max = Math.max(max, j - i);
    }
    return max;
}

示例说明:

例如输入:[0,1,2,2],我们需要维护一个大小为2的窗口。在初始状态下,窗口内没有元素,左右指针都指向数组的第一个元素。当我们移动右指针到第二个元素时,窗口包含两种元素[0, 1],此时更新最大蔬菜数量的值为2。

接下来移动右指针到第三个元素,此时窗口包含三种元素[0, 1, 2],此时需要移动左指针,直到窗口只包含两种元素[1, 2]。此时最大蔬菜数量的值为2。

继续移动右指针到第四个元素,此时窗口包含两种元素[2, 1],更新最大蔬菜数量的值为3。窗口内的蔬菜数量为3,是目前找到的最大值,因此返回3。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++题解leetcode904水果成篮 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • JAVA Spring中让人头痛的JAVA大事务问题要如何解决你知道吗

    为了能够解决JAVA Spring中的大事务问题,我们可以尝试使用两条示例进行演示。 示例一:使用分布式事务 分布式事务是解决JAVA Spring中的大事务问题的一种有效方法,可以通过以下步骤来实现: 使用Spring Boot构建分布式事务的项目。 配置分布式事务支持,以支持分布式事务管理器。 集成分布式事务管理器,比如Atomikos。 编写业务代码,…

    Java 2023年5月20日
    00
  • SpringBoot web开发源码深入分析

    SpringBoot Web 开发源码深入分析攻略 SpringBoot是目前非常热门的微服务框架,Web开发是其中的重要组成部分。下面将从源码角度详细讲解SpringBoot Web开发的攻略。 SpringBoot Web框架的核心知识点 SpringBoot Web框架的启动过程 SpringBoot常用注解和配置 SpringBoot Web框架的异…

    Java 2023年5月19日
    00
  • Java Excel数据导入数据库的方法

    下面是详细的“Java Excel数据导入数据库的方法”的攻略: 准备工作 在进行Java Excel数据导入数据库的操作之前,需要先安装以下软件: Java SE Development Kit (JDK):Java开发套件,提供Java编程所需的基本工具。 Apache POI:Java操作Office文件的API,提供对Excel、Word和Power…

    Java 2023年5月20日
    00
  • Spring使用IOC与DI实现完全注解开发

    这里是使用Spring实现完全注解开发的攻略。 什么是IOC与DI? IOC IOC,全称为Inversion of Control,控制反转,是指将业务逻辑控制转移给容器来处理,由容器通过反射机制去创建或调用对象以及处理对象之间的关系,对于容器是重度依赖的。它实现的方式有两种,分别是Setter注入和构造函数注入。 DI DI,全称为Dependency …

    Java 2023年6月2日
    00
  • Android AndBase框架使用封装好的函数完成Http请求(三)

    【标题】 Android AndBase框架使用封装好的函数完成Http请求(三)完整攻略 【内容】 本文介绍如何使用AndBase框架中封装好的函数完成Http请求,包括GET请求、POST请求和文件上传等。具体实现过程如下: 添加AndBase框架依赖库 在项目的build.gradle文件中添加AndBase的依赖库: dependencies { i…

    Java 2023年6月15日
    00
  • JSP 相关对象的使用介绍

    JSP(Java Server Pages)是一种在Java EE(Enterprise Edition)应用程序中创建动态网页的技术。在 JSP 页面中,可以使用多个内置对象来帮助 Java 代码与页面交互和实现数据传输。本文将详细介绍 JSP 相关对象的用法。 request request 对象是 JSP 页面中的一个内置对象,它代表 HTTP 请求。…

    Java 2023年6月15日
    00
  • java 中Spring task定时任务的深入理解

    对于Java中Spring task定时任务的深入理解,我们可以通过以下步骤来进行实现: 1. 添加依赖 首先,我们需要在项目中添加Spring task的相关依赖,该依赖包括: <dependency> <groupId>org.springframework</groupId> <artifactId>sp…

    Java 2023年6月15日
    00
  • docker常用命令

    一、Docker基本概念 1.镜像(Image) Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。 docker的镜像是由 镜像名+版本 组成的。如果没有指定镜像名没有指定版本,默认是…

    Java 2023年4月23日
    00
合作推广
合作推广
分享本页
返回顶部