leetcode 904:水果成篮(滑动窗口)

一:题目

在这里插入图片描述
在这里插入图片描述

二:思路

1.用两个篮子装进两个数,后面只能装入这两个相同的数,并统计个数;如果遇到其他数,则重新开始计数,
这里的重新开始计数指的是在去除第一个篮子中所装进的数
2.滑动窗口来做
滑动窗口的起始位置为:数组的起始位置
滑动体为 统计的个数
滑动窗口的结束位置为:遇到第三种水果

三:上码

int max(int a,int b){
        return a > b ? a : b; 
    }
    int totalFruit(vector<int>& fruits) {

        int j = 0;//起始位置
        int maxx = 0;//统计最大的个数
        map<int,int> m;//用于统计两种水果的数量
        map<int,int>:: iterator mt;

        for(int i = 0; i < fruits.size(); i++){

            m[fruits[i]] += 1;
            
            int temp = j;
            while(m.size() > 2){//当篮子装入水果遇到第三种水果的时候
                m[fruits[j]]--;
                if(m[fruits[j]] == 0){//这是为了淘汰前两种水果中的第一种
                    m.erase(fruits[j]);
                }   
                j++;//需要将起始指针往后移
            }
            maxx = max(maxx,i-temp);//统计前两种水果的个数
        }

        if(m.size() == 2 || m.size() == 1){//这是特殊处理水果总数为2 和 1的
            int sum = 0;
            for(mt = m.begin(); mt != m.end(); mt++){
                sum += mt->second;
            } 
            maxx = max(maxx,sum);
        }

        return maxx;
    }
};

在这里插入图片描述
菜鸡杰又水了一篇 ,滑动窗口很nice!!! 加油


版权声明:本文为qq_48508278原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。