leetcode:904. 水果成篮

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

题目来源

  • leetcode:904. 水果成篮

题目描述

在这里插入图片描述

在这里插入图片描述

题目解析

题意

题意从任意位置开始,若最多只能收集两种水果,问最多能收集多少个水果。

这道题目可以理解为求只包含两种元素的最长连续子序列,和leetcode:159.最多有两个不同字符的最长子串几乎一摸一样。唯一不同的是这里是用数字表示不同的种类

实现

思路和159题也一样,用滑动窗口求解。求最长滑动窗口长度

用一个map,key为字符,value为字符出现次数。

class Solution {
public:int totalFruit(vector<int>& tree) {int res = 0, start = 0, n = tree.size();unordered_map<int, int> fruitCnt;for (int i = 0; i < n; ++i) {++fruitCnt[tree[i]];while (fruitCnt.size() > 2) {if (--fruitCnt[tree[start]] == 0) {fruitCnt.erase(tree[start]);}++start;}res = max(res, i - start + 1);}return res;}
};

用一个map,key为字符,value为字符最新的坐标

class Solution {
public:int totalFruit(vector<int>& tree) {int res = 0, start = 0, n = tree.size();std::unordered_map<int, int> fruitPos;for (int i = 0; i < n; ++i) {fruitPos[tree[i]] = i;while (fruitPos.size() > 2){if(fruitPos[tree[start]] == start){fruitPos.erase(tree[start]);}start++;}res = std::max(res, i - start + 1);}return res;}
};
class Solution {
public:int totalFruit(vector<int>& fruits) {int i = 0; //滑动窗口左边界int sub_len = 0; //子序列长度int fruit_counter = 0; //篮子中的水果种类数int len = fruits.size();std::unordered_map<int, int> basket;//创建篮子for (int j = 0; j < len; ++j) {if(basket[fruits[j]] == 0){fruit_counter++;}basket[fruits[j]]++;//如果篮子中的水果数目超过两种,则需要移动左边界,对应从子序列中删去水果的value要减一for (; fruit_counter > 2; ++i) {basket[fruits[i]]--;//若对应水果key的value变为0,说明篮子里已经没有这种水果了,水果种类要对应变化if (basket[fruits[i]] == 0) {fruit_counter--;}}//在第二个for循环结束后,篮子中的水果一定满足题意要求,此时更新子序列长度sub_len = max(sub_len, j - i + 1);}return sub_len;}
};

类似题目

题目思路
leetcode:159.最多有两个不同字符的最长子串滑动窗口
leetcode:904. 水果成篮滑动窗口
leetcode:76. 最小子串:字符串s2覆盖s1的所有子串的最小子串 Minimum Window Substring哈希

http://chatgpt.dhexx.cn/article/9j8IWnaK.shtml

相关文章

2022-7-8 Leetcode 904.水果成篮

错误的代码&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int start 0;int end 0;set<int> myset;int len 0;for (; end < fruits.size(); end){myset.insert(fruits[end]);if (myset.size() > 2 && start &l…

【LeetCode】图解 904. 水果成篮

904. 水果成篮 904. 水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xf…

LeetCode_904 水果成篮

1、题目&#xff1a;水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c…

力扣第904题

一、题目&#xff1a;904. 水果成篮 二、题目解析&#xff1a; 题目解析&#xff1a;题目不太好理解&#xff0c;通俗解释一下&#xff0c;可以把数组中的每个元素理解成一个树&#xff0c;元素值理解成那种类型的果树&#xff0c;比如:[3,3,3,1,2,1,1,2,3,3,4] 我们可以认为1…

LeetCode 904. 水果成篮

904. 水果成篮 题目&#xff1a;你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xf…

力扣(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;…