题目链接: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;
}
};
感想: