0
点赞
收藏
分享

微信扫一扫

力扣题:904.水果成篮

深夜瞎琢磨 2022-03-30 阅读 120

题目链接:904.水果成篮
题目

示例 1

示例 2

示例 3

示例 4

思路和算法
一拿到这题,我的脑海中首先蹦出来的想法是“滑动窗口”。可能是由于上一道题用的是滑动窗口,所以这题自然而然地就想到了这种办法。用滑动窗口这一办法,需要提前弄清楚三点:(1)窗口里放什么;(2)窗口的起始位置如何定义和移动;(3)窗口的结束位置如何定义和移动。
弄清楚这三点就成功了一半,(1)窗口里放的是两种水果;(2)窗口的起始位置当水果种类更换时才移动,从数组首元素开始,用start变量来描述;(3)窗口的结束位置就是遍历整个fruits数组的指针,用end变量来描述。
这就已经成功了一半啦,剩下的一半就交给哈希表了。我使用哈希表的目的很简单,只是单纯地想用它的去重和查找,其中hash.size() <= 2是这题使用哈希表的精髓,用来保证始终都只有A和B两种水果(A和B表示两种不同的水果)。
代码(c++)

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int n = fruits.size();
        int start = 0;  //滑动窗口起始位置
        int ans = 0;
        int end = 0;    //滑动窗口结束位置
        while (end < n) {
            int cnt = 0;    //用来计数
            unordered_set<int> hash;
            int tmp_f = start;  //从start到end的指针
            while (hash.size() <= 2 && tmp_f < n) {  //维持始终都只有A和B两种水果
                unordered_set<int>::iterator it = hash.find(fruits[tmp_f]);
                if (it == hash.end()) {
                    hash.insert(fruits[tmp_f]);
                }
                if (hash.size() <= 2) {
                    ++cnt;
                    ++tmp_f;
                    if (tmp_f >= end) ++end;
                }
            }
            ++start;
            ans = cnt < ans ? ans : cnt;
        }
        return ans;
    }
};

感想:

举报

相关推荐

0 条评论