抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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

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


904. 水果成篮

思路

  • 采用滑动窗口。考虑:窗口内是啥?什么时候移动 start?什么时候移动end
  • 刚开始不成熟的想法是,end 初始指向 start 后一个,然后依次遍历;窗口内是目标元素;当 count > 2,移动 start。想法与正解差不多,但问题出在 start 该向右移动多少元素的地方。我的想法就是简单的当 start != start + 1,(即当满足这个条件后 count 就减少 1)再移动一次后停止了,这样会导致移动的位置过少,譬如:[3,3,3,1,2,1,1,2,3,3,4],问题体现在当 end 指向 fruits[8] = 3 时,通过我的想法 start 只会前进到 fruits[4] = 2 上进而停止了。正确的位置应该是 fruits[7] = 2 上。所以正确的停止条件是当 unordered_map 中记录的键值对减少为 2 后,才停止

学习点

代码

错误答案:

我的错误想法

```cpp class Solution { public: int totalFruit(vector& fruits) { int n = fruits.size(); int start = 0, end = start + 1; int maxLen = 1; // 记录窗口内不同种类的个数 int count = 1; // 记录窗口内是否存在该种类 vector exist(n, false); exist[fruits[start]] = true; while (end < n && start < end) { if (fruits[end] != fruits[end - 1]) { // 如果end指向的元素不存在 if (!exist[fruits[end]]) { count++; exist[fruits[end]] = true; } // 新加这个种类后种类大于2 /** * 这里有问题 */ // start前进 while (count > 2) { if (fruits[start] != fruits[start + 1]) { count--; exist[fruits[start]] = false; } start++; } } maxLen = max(maxLen, end - start + 1); end++; }

      return maxLen;
      }
  };
```

正确答案:




本站采用 Volantis 主题设计