LeetCode 904. 水果成篮

article/2025/9/26 18:15:09

904. 水果成篮

题目:你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。
你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:
(1)你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
(2)一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

来源:力扣(LeetCode)
链接 https://leetcode.cn/problems/fruit-into-baskets

个人思路

  1. 刚开始想着用动规,但没能构建出前后关系,然后想着模拟一下试试。
    首先使用nums列表记录要采摘的两种类型的果树,然后使用left和right两个分别标记当前遍历采摘中这两种水果最后出现的位置,当出现新的水果种类时,计算该次采摘的数量,然后把最后位置出现较远的水果类型去掉,更新要采摘的水果类型及位置。
class Solution:def totalFruit(self, fruits: List[int]) -> int:res = 0nums = []left,right = 0,0   # left为nums[0]的最后位置,right为nums[1]的最后位置count = 0   # 当前最大数量size = len(fruits)for i in range(size):# print(left,right,nums,count)if fruits[i] not in nums:# 开始状态if len(nums) < 2:# 出现第二种类型的果树时更新right的值if len(nums) == 1:right = inums.append(fruits[i])count += 1else:# 更新当前两种类型的果树nums[0] = fruits[left] if left > right else fruits[right]nums[1] = fruits[i]res = res if res > count else count# 前面已经遍历的nums[0]类型果树的数量count = abs(left - right) + 1left = max(left,right) right = ielse:if fruits[i] == nums[0]:left = ielse:right = icount += 1return res if res > count else count

在这里插入图片描述

复杂度分析

时间复杂度:O(n)只需一次遍历
空间复杂度:O(1)只需常数空间

官方思路

  1. 滑动窗口,其实我上面的应该也是滑动窗口
    (1)我们可以使用滑动窗口解决本题,left 和 right 分别表示满足要求的窗口的左右边界,同时我们使用哈希表存储这个窗口内的数以及出现的次数。
    (2)我们每次将right 移动一个位置,并将fruits[right] 加入哈希表。如果此时哈希表不满足要求(即哈希表中出现超过两个键值对),那么我们需要不断移动 left,并将 fruits[left] 从哈希表中移除,直到哈希表满足要求为止。
    (3)需要注意的是,将 fruits[left] 从哈希表中移除后,如果 fruits[left] 在哈希表中的出现次数减少为0,需要将对应的键值对从哈希表中移除。
class Solution:def totalFruit(self, fruits: List[int]) -> int:cnt = Counter()left = ans = 0for right, x in enumerate(fruits):cnt[x] += 1while len(cnt) > 2:cnt[fruits[left]] -= 1if cnt[fruits[left]] == 0:cnt.pop(fruits[left])left += 1ans = max(ans, right - left + 1)return ans

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/fruit-into-baskets/solution/shui-guo-cheng-lan-by-leetcode-solution-1uyu/
来源:力扣(LeetCode)


http://chatgpt.dhexx.cn/article/QOOh7GJE.shtml

相关文章

力扣(LeetCode)904. 水果成篮(C语言)

一、环境说明 本文是 LeetCode 904题 : 水果成篮&#xff0c;使用c语言实现滑动窗口哈希集合。测试环境:Visual Studio 2019 二、代码展示 //滑动窗口哈希表&#xff0c;一次遍历O(n) //难点&#xff1a;如何用判断边界的移动时机,应该可以自己实现。 //right和left不一定相…

(解决方案) Visual Studio 2019 连接 SQL Server 2019 数据库时,数据库版本为904无法打开,此服务器支持852版及更低版本的问题

我在做课设程序时连不上数据库&#xff0c;提示数据库版本太高。即使在数据库设置里把兼容性改到2016(852版)仍然无法连接&#xff0c;网上找的解决方法也不成功&#xff0c;自己摸索了一番找到了解决方法。具体是直接连接数据库的服务器&#xff0c;而不是连接数据库本身&…

【Linux】make的工作原理和makefile文件

● makefile文件 make是一个命令&#xff0c;makefile是一个文件。make命令执行时&#xff0c;需要一个 Makefile 文件&#xff0c;以告诉make命令需要怎么样的去编译和链接程序。一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;ma…

简单的makefile文件编写

习惯了windows下ide创建工程已经代码的编写&#xff0c;然后一键运行&#xff0c;很简单&#xff0c;因为很多事ide都帮我们做了&#xff0c;但是linux下不一样&#xff0c;需要手动编译&#xff0c;执行一条条的命令&#xff0c;一般工程都是由于很多文件组成的&#xff0c;比…

如何编写一个简单的Makefile文件

在c语言学习的初级阶段&#xff0c;我们所写的代码量较少&#xff0c;分装的文件也很少&#xff0c;直接使用gcc编译便能满足我们的大部分需求&#xff0c;然而随着我们学习的深入&#xff0c;代码量越来越多&#xff0c;已经开始做一些工程项目了&#xff0c;项目中包含多个c文…

Linux下编写makefile文件

首先在vi编辑器下编写add.c #include "test.h" #include <stdio.h> int add(int a, int b) { return a b; } int main() { printf(" 2 3 %d\n", add(2, 3)); printf(" 5 - 3 %d\n", sub(5, 3)); return 1; } 再编写sub.c…

如何创建 makefile文件

在学习 任哲《嵌入式实时操作系统 uCOS-II 原理及应用》中如何创建makefile文件呢&#xff1f; 1&#xff0c;创建一个名为makefile的文件&#xff08;取消扩展名&#xff09; 输入下面命令示例内容 target1: md 11 target2: md 22 target3: rd 11 rd 22 2&am…

Makefile文件的简单编写

参考&#xff1a; MakeFile文件是什么——内容、工作原理、作用、使用 嵌入式操作系统linux篇&#xff08;书&#xff09; Makefile伪目标 GNU make中文手册.pdf 在嵌入式开发中&#xff0c;一个工程中的源文件是非常多的&#xff0c;如果一个个编译会很麻烦&#xff0c;Makefi…

带你去了解什么是makefile文件

GNU make命令是用来控制从源文件生成可执行文件或非可执行文件的方式。那么make命令又是通过makefile文件来控制了。所以了解makefile文件就显得很有必要了。 makefile文件由许多规则组成&#xff0c;这些规则的形式一般是这样的&#xff1a; 目标 ... : 先决条件 ...命令目标…

linux下制作makefile文件

1.最简单的一种当然也是最麻烦的一种(makefile 中的代码如下&#xff0c;其中hello.cpp是文件名&#xff0c;hello是编译后的命名。使用方法是直接输入 make) hello:hello.cpp …

编写 Makefile文件 (一)

参考&#xff1a;《linux程序设计&#xff08;第四版&#xff09;》 本文的编写从简单到复杂&#xff0c;一步一步完成Makefile文件的编写和完善。首先看一下我们的程序有哪些文件&#xff1a; 文件内的程序也很简单&#xff0c;就是输出该文件已经被调用&#xff0c;代码如下…

如何编写makefile文件

文章目录 1. makefile文件的作用2. makefile文件编写格式C代码举例编写makefile文件 3. makefile编写习惯优化使用中间文件定义变量自动变量通配符假想目标 1. makefile文件的作用 在很多的生产环境中&#xff0c;一个项目的运行往往要有很多源程序文件生成最终的可执行文件&am…

Linux下makefile文件的编写

在学习如何编写makefile文件之前&#xff0c;我们首先需要了解什么是makefile文件&#xff1a; makefile描述了整个工程的编译和链接等规则。它指明了哪些文件需要先编译&#xff0c;哪写文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至进行更复杂的功能操作。…

Makefile文件详解一(怎么在Windows下使用Makefile文件)

前言&#xff1a;如果熟悉在Linux开发的话&#xff0c;肯定知道Makefile文件的用处&#xff0c;它给我们带来很多的便利。在Linux系统下并不会像Windows那么多开发工具&#xff0c;在Windows下&#xff0c;只要在开发工具上点击一个按钮&#xff0c;就能将工程的所有源码进行编…

makefile文件编写

makefile文件用于管理和组织代码工程的编译和链接&#xff0c;其不是可执行文件&#xff0c;其被make工具解析并完成相关动作&#xff0c;下面笔者将介绍makefile中常用的一些语法说明&#xff1a; 1、文件包含&#xff1a; 语法&#xff1a;include 文件名 作用&#xff1a;…

make中makefile文件的创建和使用

Makefile文件就是一种定义规则的文件&#xff0c;规则不同但格式基本相同&#xff0c;如图 一个makefile中有多个规则&#xff0c;但最终形成一个makefile文件&#xff0c;且只有一个终极目标&#xff0c;第一行就是终极目标。 格式: 1.目标文件&#xff1a;&#xff08;如mai…

【Linux基础】如何编写Makefile文件?

文章目录 前言一、make工具简介1.什么是make?2.如何安装make? 二、编写Makefile文件1.文件组成2.工作原理3.Makefile文件优点4.单级目录下的Makefile文件编写5.多级目录下的Makefile文件编写 总结 前言 我们刚开始在Linux系统下进行编程时&#xff0c;采用的编译方法为&#…

从0开始教你编写Makefile文件

目录 编写Makefile第一步&#xff0c;了解什么是Makefile&#xff1f; 编写Makefile第二步&#xff0c;明白编译链接过程 编写Makefile第三步&#xff0c;实现简单的Makefile(生成单个可执行文件) 解释一下一个简简单单的make都干了什么&#xff1f; 编写Makefile第四步&am…

C语言makefile文件

文章目录 一、makefile的编写二、make命令三、makefile文件中的变量四、应用经验五、课后作业六、版权声明 在软件的工程中的源文件是很多的&#xff0c;其按照类型、功能、模块分别放在若干个目录和文件中&#xff0c;哪些文件需要编译&#xff0c;那些文件需要后编译&#xf…

【Linux】Makefile文件

1.Makefile的作用 Makefile文件定义了一系列的规则来指定哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;可以实现自动化编译&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0…