Java C++题解leetcode904水果成篮

yizhihongxing

题目描述:

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

示例 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日

相关文章

  • 站长必看!赚钱网站资源贴

    站长必看!赚钱网站资源贴 一、引言 作为一个网站站长,赚钱是我们始终追求的一个目标。然而,在众多的网络赚钱方法中选择适合自己的方式并不是一件容易的事情。因此,本文针对网站站长提供了一些有用的资源和建议,帮助您更加容易地赚钱。 二、网站广告 网站广告是一种常见的赚钱方式,下面列出几种常见的广告形式: 1. 横幅广告 横幅广告是在页面的顶部或底部显示的广告条,通…

    Java 2023年6月16日
    00
  • JetCache 缓存框架的使用及源码解析(推荐)

    JetCache 缓存框架的使用及源码解析(推荐) 简介 JetCache 是一个基于 Java 语言的高性能缓存框架,具备很高的灵活性和扩展性,可以支持 Redis、Memory、Lru、Caffeine、Tair 等缓存模式。JetCache 提供了基于注解的缓存操作方式,也提供了编程式的缓存操作方式,使用起来非常简单。 安装 在 pom.xml 文件中…

    Java 2023年5月20日
    00
  • 一文带你快速学会JDBC及获取连接的五种方式

    一文带你快速学会JDBC及获取连接的五种方式 JDBC(java database connectivity)是Java语言操作数据库的标准API。在Java应用程序中,我们必须通过JDBC API来获取数据库连接,进而执行SQL语句。 本文将介绍JDBC的基础知识及使用方法,并详细讲述获取连接的五种方式。 JDBC基础知识 JDBC 架构 JDBC API…

    Java 2023年5月20日
    00
  • 使用@Autowired注解引入server服务层方法时报错的解决

    针对使用@Autowired注解引入server服务层方法时报错的解决方案,我将提供以下攻略: 1. 问题描述 使用@Autowired注解引入server服务层方法时,你可能会遇到以下报错信息之一: 1) The dependencies of some of the beans in the application context form a cycl…

    Java 2023年6月15日
    00
  • 详解使用Spring Data repository进行数据层的访问问题

    使用Spring Data Repository进行数据层的访问是一种非常高效、便捷的方式。在使用之前,我们需要先了解一些Spring Data Repository的基本概念和使用方法。 Spring Data Repository基本概念 Spring Data Repository本质上是一个通用的DAO(Data Access Object)接口,它…

    Java 2023年6月2日
    00
  • Java中s.charAt(index)用于提取字符串s中的特定字符操作

    当使用Java编写代码时,经常需要操作字符串。Java中提供了许多字符串相关的方法,其中包括charAt()方法,可以用于提取字符串中特定位置的字符。在下面的攻略中,我们将详细讲解charAt()方法的用法及示例。 1. 正确使用charAt()方法 charAt()方法可以用于提取字符串中特定位置的字符。要使用该方法,必须向其传递一个参数,该参数为字符串中…

    Java 2023年5月27日
    00
  • Spring AOP切面解决数据库读写分离实例详解

    下面是完整的攻略: 简介 在基于Spring框架进行开发时,为了提高数据库的读写性能,可以将读写操作分别分配到不同的数据库中,这就是数据库读写分离。Spring框架提供了AOP编程,可以把业务逻辑和数据库操作分开,使得业务逻辑更加专注,减少代码的耦合度。本文基于Spring AOP切面,详细演示实现数据库读写分离的过程。 准备工作 一、配置依赖 在pom.x…

    Java 2023年6月15日
    00
  • SpringBoot2整合Drools规则引擎及案例详解

    Spring Boot 2整合Drools规则引擎及案例详解可以分为以下几个步骤: 第一步:引入Drools依赖 在pom.xml文件中引入Drools的依赖: <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</arti…

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