leetcode 904
时间复杂度:O(n)
空间复杂度:O(1)
之前发布了一个滑动窗口的题目解答思路,参考博文:长度最小的子数组
本题也是基于滑动窗口的一个扩展题,主要解决方法是利用滑动窗口+哈希表
var totalFruit = function (fruits) {
const map = new Map();
let slow = 0; // 起始位置
let result = 0; // 最大水果数
fruits.forEach((item,index) => {
const hasFruit = map.has(item);
if (hasFruit) {
// 已经存在
map.set(item, map.get(item) + 1) // 给当前数量+1
} else {
// 篮子中还没有这个水果,初始化
map.set(item, 1)
while (map.size > 2) {
// 篮子中水果数量超出,从起始位置开始拿出水果
const delFru = fruits[slow]
map.set(delFru, map.get(delFru) - 1) //
if (map.get(delFru) === 0) {
// 篮子中已经没有此水果,如果不delete的话map.size不会更新
map.delete(delFru)
}
slow++; // 左窗口右移
}
}
result = Math.max(result,index - slow + 1)
})
return result;
};