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

发布时间:2024年01月12日

一,题目描述

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组?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;

    }
};

文章来源:https://blog.csdn.net/qq_41934502/article/details/135563215
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。