在做题中学习(46):水果成篮

发布时间:2024年01月16日

904. 水果成篮 - 力扣(LeetCode)

读题和示例:可转化为求一个最长的子数组,它的数字(水果)种类要? <=2.

解法:同向双指针————>滑动窗口

思路:因为要记录数字(水果)种类,因此需要一个哈希表来做一个下标的映射————>用来存放数字(水果)是何种种类,还需要一个变量记录已有的种类个数。

滑动窗口步骤:

1.left = 0,right = 0.

2.进窗口————>kind[fruits[right]]++

3.判断————>kinsum是否符合要求

4.出窗口+重复判断————>kind[fruits[left]]--

5.更新结果————> 取一个更大的len

class Solution 
{
public:
    int totalFruit(vector<int>& fruits) 
    {
        int kind[100000] = {0};
        int len = 0,kindsum = 0;
        for(int left = 0,right = 0;right<fruits.size();)
        {
            //先判断是因为哈希表中此位置为0时,代表没有这个种类
            //因此种类需要++
            if(kind[fruits[right]]==0)
            {
                kindsum++;
            }
            //1.进窗口
            kind[fruits[right]]++; 
            //2.判断
            while(kindsum > 2)
            {
                //3.出窗口
                kind[fruits[left]]--;
                //一个数出去后,那个位置重新变为0时,代表这个种类没有了
                //因此这个需要--
                if(kind[fruits[left]]==0)
                {
                    kindsum--;
                }
                left++;
            }
            //4.更新结果
            len = max(len,right - left + 1);
            right++;
        }
        return len;
    }
};
文章来源:https://blog.csdn.net/yiren_liusong/article/details/135508066
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。