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实现跳跃表的示例详解

    让我来为您详细讲解“Java实现跳跃表的示例详解”的完整攻略。 什么是跳跃表 跳跃表是一种特殊的数据结构,它能快速地在有序链表中进行查找、插入和删除等操作,其效率甚至可以比拟红黑树。 跳跃表通过概率分布来随机地确定新节点的层数,这样就可以在一定程度上减少查找时需要比较的节点数目,从而提高查找效率。同时,跳跃表还可以通过动态调整层数来保证其平衡性。 如何实现跳…

    Java 2023年5月18日
    00
  • SpringBoot用JdbcTemplates操作Mysql实例代码详解

    下面我将详细讲解“SpringBoot用JdbcTemplates操作Mysql实例代码详解”的完整攻略,包括示例说明。 介绍 Spring Boot是一个快速搭建基于Spring框架的应用程序的开发框架。它简化了许多开发任务,使得开发人员可以快速构建并启动应用程序。在Spring Boot中,JDBC是一种常用的访问关系数据库的方法。当使用Spring B…

    Java 2023年5月20日
    00
  • 教你怎么在win10环境下安装jdk8

    下面是详细的“在win10环境下安装jdk8”的攻略: 安装JDK8的步骤 1. 下载JDK8安装包 在Oracle官网下载JDK8安装包,下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 2. 运行安装包 双击下载得到的安装包,按照提示进行安装。注…

    Java 2023年5月26日
    00
  • js鼠标滑过弹出层的定位IE6bug解决办法

    下面是详细讲解“js鼠标滑过弹出层的定位IE6bug解决办法”的完整攻略。 问题描述 当使用JavaScript实现鼠标滑过弹出层的定位时,在IE6浏览器中会出现定位错误的问题,即定位偏移问题。这是因为IE6浏览器中对定位方式的支持不同于现代浏览器,导致JavaScript计算位置出现偏差。 解决办法 解决IE6下鼠标滑过弹出层定位的问题,可以使用以下两种方…

    Java 2023年6月15日
    00
  • PHP:微信小程序 微信支付服务端集成实例详解及源码下载

    PHP:微信小程序微信支付服务端集成实例详解 在本文中,我们将为大家讲解如何在 PHP 中集成微信支付服务端,并包含了两个具体的示例。 准备工作 在开始集成之前,需要完成以下准备工作: 注册微信支付账号 在微信支付后台配置公众号或小程序,并设置回调地址 安装 curl 扩展 集成微信支付服务端 首先,我们需要在 PHP 代码中引用微信支付 SDK,可以使用 …

    Java 2023年5月23日
    00
  • Spring Security入门demo案例

    下面是Spring Security入门demo案例的完整攻略。 一、前置知识 在开始学习Spring Security入门demo案例之前,你需要具备以下一些基础知识: 基本的Java编程语言和Spring框架的了解; 熟悉Spring MVC框架的开发以及相关的Maven工程构建方式。 二、Spring Security简介 Spring Securit…

    Java 2023年5月20日
    00
  • Java 定时器的多种实现方式

    Java 定时器的多种实现方式 前言 在 Java 开发中,我们经常需要编写定时任务,如定时备份、定时发送消息等。这些任务需要在指定时间点或时间间隔内执行。而实现这些定时任务的方法有多种,本文将一一介绍这些方式,包括 Java 内置定时器、定时线程池、Quartz 框架以及 Spring 自带的定时任务。 Java 内置定时器 Java 内置了一个 Time…

    Java 2023年5月18日
    00
  • 详解Spring Boot 配置加载顺序及属性加载顺序

    详解SpringBoot配置加载顺序及属性加载顺序 在 Spring Boot 应用程序中,配置文件的加载顺序和属性的加载顺序是非常重要的。在本文中,我们将详细讲解 Spring Boot 配置加载顺序及属性加载顺序的完整攻略,并提供两个示例。 配置文件的加载顺序 Spring Boot 应用程序中的配置文件有多种类型,例如 application.prop…

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