当前位置: 首页 > news >正文

双指针问题——求只包含两个元素的最长连续子序列(子数组)

一,题目描述

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

  • 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
  • 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
  • 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。

给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

示例 1:

输入:fruits = [1,2,1]
输出:3
解释:可以采摘全部 3 棵树。

示例 2:

输入:fruits = [0,1,2,2]
输出:3
解释:可以采摘 [1,2,2] 这三棵树。
如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。

示例 3:

输入:fruits = [1,2,3,2,2]
输出:4
解释:可以采摘 [2,3,2,2] 这四棵树。
如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。

示例 4:

输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]
输出:5
解释:可以采摘 [1,2,1,1,2] 这五棵树。

提示:

  • 1 <= fruits.length <= 105
  • 0 <= fruits[i] < fruits.length

二,题目接口

class Solution {
public:int totalFruit(vector<int>& fruits) {}
};

三,解题思路

1,统计子数组中各个元素出现的次数。

2,统计元素的类型。

3,在子数组元素类型的数量等于二时才会更新ans。

4,当这个子数组元素的类型大于二时,从左到右将元素对应的数量减一。直到某个元素的数量变为0就将元素类型的数量减一。

代码实现如下:

class Solution {
public:int totalFruit(vector<int>& fruits) {int n = fruits.size();int ans = 0;//保存答案int countType = 0;//统计元素类型数量unordered_map<int,int>hash;//哈希表统计元素的数量for(int r = 0,l = 0;r<n;r++){if(++hash[fruits[r]] == 1)//这个元素类型的数量从零到一便将类型加一{countType++;}if (countType>2)//当出现类型的数量等于3时做以下处理{while(--hash[fruits[l++]]);countType--; //当某个元素的值变为0时便将counttype减1}ans = max(ans,r-l+1);//更新最大值}return ans;}
};

http://www.lryc.cn/news/279005.html

相关文章:

  • Unity组件开发--短连接HTTP
  • 真正的强大,原来是不动声色的
  • git 查看tag和创建tag以及上传tag命令
  • 代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差
  • 【Linux】Linux 系统编程——tree 命令
  • Android简单控件
  • 【Java 干货教程】Java实现分页的几种方式详解
  • 关于Python里xlwings库对Excel表格的操作(三十一)
  • QML使用QCustomPlot笔记
  • 【REST2SQL】06 GO 跨包接口重构代码
  • 《NLP入门到精通》栏目导读
  • C++学习笔记——类继承
  • ARCGIS PRO SDK 使用条件管理 Pro UI
  • Halcon经典的边缘检测算子Sobel/Laplace/Canny
  • 用单片机设计PLC电路图
  • 【设计模式-6】建造者模式的实现与框架中的应用
  • PositiveSSL和Sectigo的多域名证书
  • Docker:docker exec命令简介
  • 【大数据进阶第三阶段之Hive学习笔记】Hive的数据类型与数据操作
  • GPT2:Language Models are Unsupervised Multitask Learners
  • 微创新与稳定性的权衡
  • 对回调函数的各种讲解说明
  • Java多线程:创建多线程的三种方式
  • Unity中打印信息的两种方式
  • 给定n个字符串s[1...n], 求有多少个数对(i, j), 满足i < j 且 s[i] + s[j] == s[j] + s[i]?
  • Linux磁盘空间与文件大小查看命令详解
  • 网络通信过程的一些基础问题
  • STL——stack容器和queue容器详解
  • django websocket实现聊天室功能
  • 软件测评中心▏性能测试之压力测试、负载测试的区别和联系简析